--- ray/src/rt/m_brdf.c 1993/11/18 09:43:04 2.9 +++ ray/src/rt/m_brdf.c 1994/12/21 09:51:46 2.11 @@ -16,6 +16,8 @@ static char SCCSid[] = "$SunId$ LBL"; #include "func.h" +extern int backvis; /* back faces visible? */ + /* * Arguments to this material include the color and specularity. * String arguments include the reflection function and files. @@ -268,7 +270,7 @@ register RAY *r; transdist = r->rot + sr.rt; } if (r->crtype & SHADOW) /* the rest is shadow */ - return; + return(1); /* compute reflected ray */ setbrdfunc(&nd); errno = 0; @@ -308,6 +310,8 @@ register RAY *r; /* check distance */ if (transtest > bright(r->rcol)) r->rt = transdist; + + return(1); } @@ -321,7 +325,7 @@ register RAY *r; double dtmp; /* always a shadow */ if (r->crtype & SHADOW) - return; + return(1); /* check arguments */ if (m->oargs.nsargs < (hasdata(m->otype)?4:2) | m->oargs.nfargs < (m->otype==MAT_TFUNC|m->otype==MAT_TDATA?6:4)) @@ -347,9 +351,15 @@ register RAY *r; /* compute reflectance */ dtmp = 1.0 - nd.trans - nd.rspec; setcolor(nd.rdiff, dtmp, dtmp, dtmp); - /* fix orientation */ - if (r->rod < 0.0) - flipsurface(r); + /* check for back side */ + if (r->rod < 0.0) { + if (!backvis && m->otype != MAT_TFUNC + && m->otype != MAT_TDATA) { + raytrans(r); + return(1); + } + flipsurface(r); /* reorient if backvis */ + } /* get modifiers */ raytexture(r, m->omod); nd.pdot = raynormal(nd.pnorm, r); /* perturb normal */ @@ -381,6 +391,8 @@ register RAY *r; } /* add direct component */ direct(r, dirbrdf, &nd); + + return(1); }