rgb lighting(scene s, ray r, hit_test h) { rgb result; if (h.miss) return s.bg; vec hit_position = ray_position(r, h.dist); if (shadow(hit_position, s.light, s.spheres)) { result = rgb_modulate(h.surf, s.amb); } else { double dot = vec_dot(h.surf_norm, s.light.direction); double d = double_max(0, dot); rgb diffuse_light = rgb_scale(d, s.light.color); rgb lsum = rgb_add(s.amb, diffuse_light); result = rgb_modulate(h.surf, lsum); } /**** === implement specular reflection here === ****/ if (rgb_nonzero(h.shine)) { rgb ss; vec N = h.surf_norm; vec L = s.light.direction; rgb S = h.shine; vec R = vec_sub( vec_scale(2* vec_dot(N,L),N),L); vec V = vec_neg(r.direction); if (vec_dot(N,L)>0){ ss = rgb_scale( pow( double_max( vec_dot(R,V),0), 6), S); //rgb_print(k); } else ss = rgb_expr(0,0,0); return rgb_add(result,ss); } return result; }
frame compute_frame(timestamp t) { frame f; f.ts = t; f.bg = rgb_expr(.1, .1, .4); fsphere sph0 = {vec_expr(.67, 0, 4), 0.67, compute_surf, compute_shine}; fsphere_list *spheres = fsl_cons(sph0, NULL); f.spheres = spheres; vec ldir = vec_norm(vec_expr(-3,1,-1)); light lt = {ldir,{1,1,1}}; f.light = lt; rgb amb = rgb_expr(.33, .33, .33); f.amb = amb; return f; }
rgb compute_shine(timestamp t) { return rgb_expr(.4, .4, .4); }
rgb compute_surf(vec center, vec loc, timestamp t) { return rgb_expr(sin(loc.x*t), sin(loc.y*t), sin(loc.z*t)); }