{
let refractive_indices = [1.0, 1.5]
let emitted_colors = [[3.0,3.0,3.0], [0.0,0.0,0.0]]
let centers = [[-1.0,0.0,-5.0], [1.0,0.0,-5.0]]
let radii = [1.0, 1.0]
let specular_reflectivity = [[0.0,0.0,0.0], [0.0,0.0,0.0]]
let num_small_spheres = 10
let small_radius = 0.3*Math.pow(1.0/num_small_spheres, 0.333)
for (var i = 0; i < num_small_spheres; i++) {
refractive_indices.push(1.5)
emitted_colors.push([0.0,0.0,0.0])
centers.push(random_in_sphere([1.0, 0.0, -5.0], 1.0-1.1*small_radius))
radii.push(-small_radius)
specular_reflectivity.push([0.0,0.0,0.0])
}
return renderSamplesImage (2, function (ray_origin, ray_direction, accum) {
var hit_something, t, i
let multiplier = [1.0,1.0,1.0]
for (var bounces = 0; bounces < 30; bounces++){
[hit_something, t, i] = hit_array(ray_origin, ray_direction, centers, radii)
if (hit_something){
if (not_zero (emitted_colors [i])) {
accum = addVV (accum, emitted_colors [i])
break
}
ray_origin = addVV (ray_origin, mulVS (ray_direction, t))
let surface_normal = mulVS (subVV (ray_origin, centers[i]), 1.0/radii[i])
if (refractive_indices [i] > 1.0) {
let cosine1 = dot(ray_direction,surface_normal)
var ni, nt
if (cosine1 < 0){
ni = 1.0
nt = refractive_indices[i]
} else {
ni = refractive_indices[i]
nt = 1.0
surface_normal = subVV ([0, 0, 0], surface_normal)
}
var can_refract, refracted_direction
[can_refract, refracted_direction] = refract(ray_direction, surface_normal, ni, nt)
if (can_refract) {
cosine1 = Math.abs(cosine1)
let cosine2 = Math.abs(dot(refracted_direction, surface_normal))
let cosine = Math.min (cosine1, cosine2)
let prob_reflect = glass_fresnel(cosine)
if (randomUniform() < prob_reflect) {
ray_direction = reflect(ray_direction, surface_normal)
} else {
ray_direction = refracted_direction
}
} else {
ray_direction = reflect(ray_direction, surface_normal)
}
} else {
ray_direction = reflect (ray_direction, surface_normal)
multiplier = mulVV (multiplier, specular_reflectivity[i])
}
} else {
accum = addVV (accum, mulVV (multiplier, background_color (ray_direction)))
break
}
}
return accum
})
}