.1?Vec(0,1):Vec(1))%w).norm(), v=w%u; 63 | Vec d = (u*cos(r1)*r2s + v*sin(r1)*r2s + w*sqrt(1-r2)).norm(); 64 | return obj.e + f.mult(radiance(Ray(x,d),depth,Xi)); 65 | } else if (obj.refl == SPEC) // Ideal SPECULAR reflection 66 | return obj.e + f.mult(radiance(Ray(x,r.d-n*2*n.dot(r.d)),depth,Xi)); 67 | Ray reflRay(x, r.d-n*2*n.dot(r.d)); // Ideal dielectric REFRACTION 68 | bool into = n.dot(nl)>0; // Ray from outside going in? 69 | double nc=1, nt=1.5, nnt=into?nc/nt:nt/nc, ddn=r.d.dot(nl), cos2t; 70 | if ((cos2t=1-nnt*nnt*(1-ddn*ddn))<0) // Total internal reflection 71 | return obj.e + f.mult(radiance(reflRay,depth,Xi)); 72 | Vec tdir = (r.d*nnt - n*((into?1:-1)*(ddn*nnt+sqrt(cos2t)))).norm(); 73 | double a=nt-nc, b=nt+nc, R0=a*a/(b*b), c = 1-(into?-ddn:tdir.dot(n)); 74 | double Re=R0+(1-R0)*c*c*c*c*c,Tr=1-Re,P=.25+.5*Re,RP=Re/P,TP=Tr/(1-P); 75 | return obj.e + f.mult(depth>2 ? (erand48(Xi)