109 |
|
/* transform source direction */ |
110 |
|
if (SDmapDir(vsrc, ndp->toloc, ldir) != SDEnone) |
111 |
|
return(0); |
112 |
+ |
/* assign number of samples */ |
113 |
+ |
ec = SDsizeBSDF(&tomega, ndp->vray, vsrc, SDqueryMin, ndp->sd); |
114 |
+ |
if (ec) |
115 |
+ |
goto baderror; |
116 |
|
/* check indirect over-counting */ |
117 |
|
if (ndp->thick != 0 && ndp->pr->crtype & (SPECULAR|AMBIENT) |
118 |
|
&& vsrc[2] > 0 ^ ndp->vray[2] > 0) { |
119 |
|
double dx = vsrc[0] + ndp->vray[0]; |
120 |
|
double dy = vsrc[1] + ndp->vray[1]; |
121 |
< |
if (dx*dx + dy*dy <= omega*(1./PI)) |
121 |
> |
if (dx*dx + dy*dy <= omega+tomega) |
122 |
|
return(0); |
123 |
|
} |
120 |
– |
/* assign number of samples */ |
121 |
– |
ec = SDsizeBSDF(&tomega, ndp->vray, vsrc, SDqueryMin, ndp->sd); |
122 |
– |
if (ec) |
123 |
– |
goto baderror; |
124 |
|
sf = specjitter * ndp->pr->rweight; |
125 |
|
if (25.*tomega <= omega) |
126 |
|
nsamp = 100.*sf + .5; |
157 |
|
return(ok); |
158 |
|
baderror: |
159 |
|
objerror(ndp->mp, USER, transSDError(ec)); |
160 |
+ |
return(0); /* gratis return */ |
161 |
|
} |
162 |
|
|
163 |
|
/* Compute source contribution for BSDF (reflected & transmitted) */ |
500 |
|
upvec[1] = evalue(mf->ep[2]); |
501 |
|
upvec[2] = evalue(mf->ep[3]); |
502 |
|
/* return to world coords */ |
503 |
< |
if (mf->f != &unitxf) { |
504 |
< |
multv3(upvec, upvec, mf->f->xfm); |
505 |
< |
nd.thick *= mf->f->sca; |
503 |
> |
if (mf->fxp != &unitxf) { |
504 |
> |
multv3(upvec, upvec, mf->fxp->xfm); |
505 |
> |
nd.thick *= mf->fxp->sca; |
506 |
|
} |
507 |
|
raynormal(nd.pnorm, r); |
508 |
|
/* compute local BSDF xform */ |
515 |
|
} |
516 |
|
if (!ec) |
517 |
|
ec = SDinvXform(nd.fromloc, nd.toloc); |
517 |
– |
/* determine BSDF resolution */ |
518 |
– |
if (!ec) |
519 |
– |
ec = SDsizeBSDF(nd.sr_vpsa, nd.vray, NULL, |
520 |
– |
SDqueryMin+SDqueryMax, nd.sd); |
518 |
|
if (ec) { |
519 |
< |
objerror(m, WARNING, transSDError(ec)); |
523 |
< |
SDfreeCache(nd.sd); |
519 |
> |
objerror(m, WARNING, "Illegal orientation vector"); |
520 |
|
return(1); |
521 |
|
} |
522 |
+ |
/* determine BSDF resolution */ |
523 |
+ |
ec = SDsizeBSDF(nd.sr_vpsa, nd.vray, NULL, SDqueryMin+SDqueryMax, nd.sd); |
524 |
+ |
if (ec) |
525 |
+ |
objerror(m, USER, transSDError(ec)); |
526 |
+ |
|
527 |
|
nd.sr_vpsa[0] = sqrt(nd.sr_vpsa[0]); |
528 |
|
nd.sr_vpsa[1] = sqrt(nd.sr_vpsa[1]); |
529 |
|
if (!hitfront) { /* perturb normal towards hit */ |
557 |
|
bnorm[2] = -nd.pnorm[2]; |
558 |
|
if (nd.thick != 0) { /* proxy with offset? */ |
559 |
|
VCOPY(vtmp, r->rop); |
560 |
< |
VSUM(r->rop, vtmp, r->ron, -nd.thick); |
560 |
> |
VSUM(r->rop, vtmp, r->ron, nd.thick); |
561 |
|
multambient(ctmp, r, bnorm); |
562 |
|
VCOPY(r->rop, vtmp); |
563 |
|
} else |