128 |
|
srchrad = sqrt(dfp->minProjSA); /* else search for peak */ |
129 |
|
setcolor(vpeak, 0, 0, 0); |
130 |
|
setcolor(vsum, 0, 0, 0); |
131 |
+ |
pdir[2] = 0.0; |
132 |
|
for (i = 0; i < NDIR2CHECK; i++) { |
133 |
|
FVECT tdir; |
134 |
|
SDValue sv; |
147 |
|
VCOPY(pdir, tdir); |
148 |
|
} |
149 |
|
} |
150 |
+ |
if (pdir[2] == 0.0) |
151 |
+ |
return; /* zero neighborhood */ |
152 |
|
ec = SDsizeBSDF(&tomega, pdir, ndp->vray, SDqueryMin, ndp->sd); |
153 |
|
if (ec) |
154 |
|
goto baderror; |
155 |
|
if (tomega > 1.5*dfp->minProjSA) |
156 |
|
return; /* not really a peak? */ |
157 |
+ |
tomega /= fabs(pdir[2]); /* remove cosine factor */ |
158 |
|
if ((bright(vpeak) - ndp->sd->tLamb.cieY*(1./PI))*tomega <= .001) |
159 |
|
return; /* < 0.1% transmission */ |
160 |
|
for (i = 3; i--; ) /* remove peak from average */ |
188 |
|
static int |
189 |
|
direct_specular_OK(COLOR cval, FVECT ldir, double omega, BSDFDAT *ndp) |
190 |
|
{ |
191 |
< |
int nsamp, ok = 0; |
191 |
> |
int nsamp; |
192 |
> |
double wtot = 0; |
193 |
|
FVECT vsrc, vsmp, vjit; |
194 |
|
double tomega, tomega2; |
195 |
|
double sf, tsr, sd[2]; |
274 |
|
if (tomega2 < .12*tomega) |
275 |
|
continue; /* not safe to include */ |
276 |
|
cvt_sdcolor(csmp, &sv); |
277 |
< |
addcolor(cval, csmp); /* else average it in */ |
278 |
< |
++ok; |
277 |
> |
/* weight average by Y */ |
278 |
> |
scalecolor(csmp, sv.cieY); |
279 |
> |
addcolor(cval, csmp); |
280 |
> |
wtot += sv.cieY; |
281 |
|
} |
282 |
< |
if (!ok) /* no valid specular samples? */ |
282 |
> |
if (wtot <= FTINY) /* no valid specular samples? */ |
283 |
|
return(0); |
284 |
|
|
285 |
< |
sf = 1./(double)ok; /* compute average BSDF */ |
285 |
> |
sf = 1./wtot; /* weighted average BSDF */ |
286 |
|
scalecolor(cval, sf); |
287 |
|
/* subtract diffuse contribution */ |
288 |
|
for (i = 3*(diffY > FTINY); i--; ) |
542 |
|
} else |
543 |
|
hasthru = 0; |
544 |
|
} |
545 |
< |
if (dfp->maxHemi - b <= FTINY) { /* how specular to sample? */ |
545 |
> |
if (dfp->maxHemi - b <= FTINY) { /* have specular to sample? */ |
546 |
|
b = 0; |
547 |
|
} else { |
548 |
|
FVECT vjit; |