380 |
|
|
381 |
|
if (sflags == SDsampSpT) { |
382 |
|
unsc = ndp->tunsamp; |
383 |
< |
dfp = ndp->sd->tf; |
383 |
> |
if (ndp->pr->rod > 0) |
384 |
> |
dfp = (ndp->sd->tf != NULL) ? ndp->sd->tf : ndp->sd->tb; |
385 |
> |
else |
386 |
> |
dfp = (ndp->sd->tb != NULL) ? ndp->sd->tb : ndp->sd->tf; |
387 |
|
cvt_sdcolor(unsc, &ndp->sd->tLamb); |
388 |
|
} else /* sflags == SDsampSpR */ { |
389 |
|
unsc = ndp->runsamp; |
473 |
|
} else { |
474 |
|
if (m->oargs.nfargs < 6) { /* check invisible backside */ |
475 |
|
if (!backvis && (nd.sd->rb == NULL) & |
476 |
< |
(nd.sd->tf == NULL)) { |
476 |
> |
(nd.sd->tb == NULL)) { |
477 |
|
SDfreeCache(nd.sd); |
478 |
|
raytrans(r); |
479 |
|
return(1); |
503 |
|
upvec[1] = evalue(mf->ep[2]); |
504 |
|
upvec[2] = evalue(mf->ep[3]); |
505 |
|
/* return to world coords */ |
506 |
< |
if (mf->f != &unitxf) { |
507 |
< |
multv3(upvec, upvec, mf->f->xfm); |
508 |
< |
nd.thick *= mf->f->sca; |
506 |
> |
if (mf->fxp != &unitxf) { |
507 |
> |
multv3(upvec, upvec, mf->fxp->xfm); |
508 |
> |
nd.thick *= mf->fxp->sca; |
509 |
|
} |
510 |
|
raynormal(nd.pnorm, r); |
511 |
|
/* compute local BSDF xform */ |
515 |
|
nd.vray[1] = -r->rdir[1]; |
516 |
|
nd.vray[2] = -r->rdir[2]; |
517 |
|
ec = SDmapDir(nd.vray, nd.toloc, nd.vray); |
515 |
– |
} |
516 |
– |
if (ec) { |
517 |
– |
objerror(m, WARNING, "Illegal orientation vector"); |
518 |
– |
return(1); |
518 |
|
} |
520 |
– |
ec = SDinvXform(nd.fromloc, nd.toloc); |
521 |
– |
/* determine BSDF resolution */ |
519 |
|
if (!ec) |
520 |
< |
ec = SDsizeBSDF(nd.sr_vpsa, nd.vray, NULL, |
524 |
< |
SDqueryMin+SDqueryMax, nd.sd); |
520 |
> |
ec = SDinvXform(nd.fromloc, nd.toloc); |
521 |
|
if (ec) { |
522 |
< |
objerror(m, WARNING, transSDError(ec)); |
527 |
< |
SDfreeCache(nd.sd); |
522 |
> |
objerror(m, WARNING, "Illegal orientation vector"); |
523 |
|
return(1); |
524 |
|
} |
525 |
+ |
/* determine BSDF resolution */ |
526 |
+ |
ec = SDsizeBSDF(nd.sr_vpsa, nd.vray, NULL, SDqueryMin+SDqueryMax, nd.sd); |
527 |
+ |
if (ec) |
528 |
+ |
objerror(m, USER, transSDError(ec)); |
529 |
+ |
|
530 |
|
nd.sr_vpsa[0] = sqrt(nd.sr_vpsa[0]); |
531 |
|
nd.sr_vpsa[1] = sqrt(nd.sr_vpsa[1]); |
532 |
|
if (!hitfront) { /* perturb normal towards hit */ |
570 |
|
flipsurface(r); |
571 |
|
} |
572 |
|
/* add direct component */ |
573 |
< |
if ((bright(nd.tdiff) <= FTINY) & (nd.sd->tf == NULL)) { |
573 |
> |
if ((bright(nd.tdiff) <= FTINY) & (nd.sd->tf == NULL) & |
574 |
> |
(nd.sd->tb == NULL)) { |
575 |
|
direct(r, dir_brdf, &nd); /* reflection only */ |
576 |
|
} else if (nd.thick == 0) { |
577 |
|
direct(r, dir_bsdf, &nd); /* thin surface scattering */ |