--- ray/src/rt/dielectric.c 1995/12/08 18:22:07 2.9 +++ ray/src/rt/dielectric.c 1998/06/17 12:53:07 2.13 @@ -1,7 +1,7 @@ -/* Copyright (c) 1986 Regents of the University of California */ +/* Copyright (c) 1998 Silicon Graphics, Inc. */ #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static char SCCSid[] = "$SunId$ SGI"; #endif /* @@ -51,17 +51,28 @@ static int lambda(); #define MINCOS 0.997 /* minimum dot product for dispersion */ extern COLOR cextinction; /* global coefficient of extinction */ -extern double salbedo; /* global scattering albedo */ +extern COLOR salbedo; /* global scattering albedo */ +static double +mylog(x) /* special log for extinction coefficients */ +double x; +{ + if (x < 1e-40) + return(-100.); + if (x >= 1.) + return(0.); + return(log(x)); +} + + m_dielectric(m, r) /* color a ray which hit a dielectric interface */ OBJREC *m; register RAY *r; { double cos1, cos2, nratio; COLOR ctrans; - double talb; - double mabsorp; + COLOR talb; double refl, trans; FVECT dnorm; double d1, d2; @@ -85,38 +96,37 @@ register RAY *r; dnorm[0] = -dnorm[0]; dnorm[1] = -dnorm[1]; dnorm[2] = -dnorm[2]; - setcolor(r->cext, -log(m->oargs.farg[0]*colval(r->pcol,RED)), - -log(m->oargs.farg[1]*colval(r->pcol,GRN)), - -log(m->oargs.farg[2]*colval(r->pcol,BLU))); - r->albedo = 0.; + setcolor(r->cext, -mylog(m->oargs.farg[0]*colval(r->pcol,RED)), + -mylog(m->oargs.farg[1]*colval(r->pcol,GRN)), + -mylog(m->oargs.farg[2]*colval(r->pcol,BLU))); + setcolor(r->albedo, 0., 0., 0.); r->gecc = 0.; if (m->otype == MAT_INTERFACE) { setcolor(ctrans, - -log(m->oargs.farg[4]*colval(r->pcol,RED)), - -log(m->oargs.farg[5]*colval(r->pcol,GRN)), - -log(m->oargs.farg[6]*colval(r->pcol,BLU))); - talb = 0.; + -mylog(m->oargs.farg[4]*colval(r->pcol,RED)), + -mylog(m->oargs.farg[5]*colval(r->pcol,GRN)), + -mylog(m->oargs.farg[6]*colval(r->pcol,BLU))); + setcolor(talb, 0., 0., 0.); } else { copycolor(ctrans, cextinction); - talb = salbedo; + copycolor(talb, salbedo); } } else { /* outside */ nratio = 1.0 / nratio; - setcolor(ctrans, -log(m->oargs.farg[0]*colval(r->pcol,RED)), - -log(m->oargs.farg[1]*colval(r->pcol,GRN)), - -log(m->oargs.farg[2]*colval(r->pcol,BLU))); - talb = 0.; + setcolor(ctrans, -mylog(m->oargs.farg[0]*colval(r->pcol,RED)), + -mylog(m->oargs.farg[1]*colval(r->pcol,GRN)), + -mylog(m->oargs.farg[2]*colval(r->pcol,BLU))); + setcolor(talb, 0., 0., 0.); if (m->otype == MAT_INTERFACE) { setcolor(r->cext, - -log(m->oargs.farg[4]*colval(r->pcol,RED)), - -log(m->oargs.farg[5]*colval(r->pcol,GRN)), - -log(m->oargs.farg[6]*colval(r->pcol,BLU))); - r->albedo = 0.; + -mylog(m->oargs.farg[4]*colval(r->pcol,RED)), + -mylog(m->oargs.farg[5]*colval(r->pcol,GRN)), + -mylog(m->oargs.farg[6]*colval(r->pcol,BLU))); + setcolor(r->albedo, 0., 0., 0.); r->gecc = 0.; } } - mabsorp = exp(-bright(r->cext)*r->rot); /* approximate */ d2 = 1.0 - nratio*nratio*(1.0 - cos1*cos1); /* compute cos theta2 */ @@ -140,7 +150,7 @@ register RAY *r; refl *= 0.5; trans = 1.0 - refl; - if (rayorigin(&p, r, REFRACTED, mabsorp*trans) == 0) { + if (rayorigin(&p, r, REFRACTED, trans) == 0) { /* compute refracted ray */ d1 = nratio*cos1 - cos2; @@ -153,11 +163,12 @@ register RAY *r; || r->crtype & SHADOW || !directvis || m->oargs.farg[4] == 0.0 - || !disperse(m, r, p.rdir, trans)) + || !disperse(m, r, p.rdir, + trans, ctrans, talb)) #endif { copycolor(p.cext, ctrans); - p.albedo = talb; + copycolor(p.albedo, talb); rayvalue(&p); scalecolor(p.rcol, trans); addcolor(r->rcol, p.rcol); @@ -168,7 +179,7 @@ register RAY *r; } if (!(r->crtype & SHADOW) && - rayorigin(&p, r, REFLECTED, mabsorp*refl) == 0) { + rayorigin(&p, r, REFLECTED, refl) == 0) { /* compute reflected ray */ for (i = 0; i < 3; i++) @@ -187,11 +198,12 @@ register RAY *r; #ifdef DISPERSE static -disperse(m, r, vt, tr) /* check light sources for dispersion */ +disperse(m, r, vt, tr, cet, abt) /* check light sources for dispersion */ OBJREC *m; RAY *r; FVECT vt; double tr; +COLOR cet, abt; { RAY sray, *entray; FVECT v1, v2, n1, n2; @@ -277,6 +289,8 @@ double tr; if (l1 > MAXLAMBDA || l1 < MINLAMBDA) /* not visible */ continue; /* trace source ray */ + copycolor(sray.cext, cet); + copycolor(sray.albedo, abt); normalize(sray.rdir); rayvalue(&sray); if (bright(sray.rcol) <= FTINY) /* missed it */