| 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 |
> |
|
| 278 |
> |
if (sf < 2.5*tsr) { /* weight by Y for small sources */ |
| 279 |
> |
scalecolor(csmp, sv.cieY); |
| 280 |
> |
wtot += sv.cieY; |
| 281 |
> |
} else |
| 282 |
> |
wtot += 1.; |
| 283 |
> |
addcolor(cval, csmp); |
| 284 |
|
} |
| 285 |
< |
if (!ok) /* no valid specular samples? */ |
| 285 |
> |
if (wtot <= FTINY) /* no valid specular samples? */ |
| 286 |
|
return(0); |
| 287 |
|
|
| 288 |
< |
sf = 1./(double)ok; /* compute average BSDF */ |
| 288 |
> |
sf = 1./wtot; /* weighted average BSDF */ |
| 289 |
|
scalecolor(cval, sf); |
| 290 |
|
/* subtract diffuse contribution */ |
| 291 |
|
for (i = 3*(diffY > FTINY); i--; ) |
| 545 |
|
} else |
| 546 |
|
hasthru = 0; |
| 547 |
|
} |
| 548 |
< |
if (dfp->maxHemi - b <= FTINY) { /* how specular to sample? */ |
| 548 |
> |
if (dfp->maxHemi - b <= FTINY) { /* have specular to sample? */ |
| 549 |
|
b = 0; |
| 550 |
|
} else { |
| 551 |
|
FVECT vjit; |