25 |
|
#endif |
26 |
|
/* estimate of Fresnel function */ |
27 |
|
#define FRESNE(ci) (exp(-5.85*(ci)) - 0.00287989916) |
28 |
+ |
#define FRESTHRESH 0.017999 /* minimum specularity for approx. */ |
29 |
|
|
30 |
|
|
31 |
|
/* |
94 |
|
/* Fresnel estimate */ |
95 |
|
lrdiff = np->rdiff; |
96 |
|
ltdiff = np->tdiff; |
97 |
< |
if (np->specfl & SP_PURE && np->rspec > FTINY && |
97 |
> |
if (np->specfl & SP_PURE && np->rspec >= FRESTHRESH && |
98 |
|
(lrdiff > FTINY) | (ltdiff > FTINY)) { |
99 |
|
dtmp = 1. - FRESNE(fabs(ldot)); |
100 |
|
lrdiff *= dtmp; |
156 |
|
/* roughness + source */ |
157 |
|
dtmp = np->alpha2 + omega*(1.0/PI); |
158 |
|
/* gaussian */ |
159 |
< |
dtmp = exp((2.*DOT(np->prdir,ldir)-2.)/dtmp) / |
159 |
< |
(PI*np->pdot*dtmp); |
159 |
> |
dtmp = exp((2.*DOT(np->prdir,ldir)-2.)/dtmp)/(PI*dtmp); |
160 |
|
/* worth using? */ |
161 |
|
if (dtmp > FTINY) { |
162 |
|
copycolor(ctmp, np->mcolor); |
163 |
< |
dtmp *= np->tspec * omega; |
163 |
> |
dtmp *= np->tspec * omega * sqrt(-ldot/np->pdot); |
164 |
|
scalecolor(ctmp, dtmp); |
165 |
|
addcolor(cval, ctmp); |
166 |
|
} |
225 |
|
mirdist = transdist = r->rot; |
226 |
|
nd.rspec = m->oargs.farg[3]; |
227 |
|
/* compute Fresnel approx. */ |
228 |
< |
if (nd.specfl & SP_PURE && nd.rspec > FTINY) { |
228 |
> |
if (nd.specfl & SP_PURE && nd.rspec >= FRESTHRESH) { |
229 |
|
fest = FRESNE(r->rod); |
230 |
|
nd.rspec += fest*(1. - nd.rspec); |
231 |
|
} else |
299 |
|
if (hastexture && DOT(nd.vrefl, r->ron) <= FTINY) |
300 |
|
for (i = 0; i < 3; i++) /* safety measure */ |
301 |
|
nd.vrefl[i] = r->rdir[i] + 2.*r->rod*r->ron[i]; |
302 |
+ |
checknorm(nd.vrefl); |
303 |
|
} |
304 |
|
/* reflected ray */ |
305 |
|
if ((nd.specfl&(SP_REFL|SP_PURE|SP_RBLT)) == (SP_REFL|SP_PURE)) { |