--- ray/src/rt/dielectric.c 1990/03/27 11:39:58 1.3 +++ ray/src/rt/dielectric.c 1993/03/08 12:37:15 2.5 @@ -16,6 +16,7 @@ static char SCCSid[] = "$SunId$ LBL"; #ifdef DISPERSE #include "source.h" +static disperse(); #endif /* @@ -53,7 +54,6 @@ m_dielectric(m, r) /* color a ray which hit something OBJREC *m; register RAY *r; { - double sqrt(), pow(); double cos1, cos2, nratio; COLOR mcolor; double mabsorp; @@ -127,6 +127,7 @@ register RAY *r; if (m->otype != MAT_DIELECTRIC || r->rod > 0.0 || r->crtype & SHADOW + || !directvis || m->oargs.farg[4] == 0.0 || !disperse(m, r, p.rdir, trans)) #endif @@ -135,7 +136,8 @@ register RAY *r; multcolor(mcolor, r->pcol); /* modify */ scalecolor(p.rcol, trans); addcolor(r->rcol, p.rcol); - r->rt = r->rot + p.rt; + if (nratio >= 1.0-FTINY && nratio <= 1.0+FTINY) + r->rt = r->rot + p.rt; } } } @@ -151,8 +153,6 @@ register RAY *r; scalecolor(p.rcol, refl); /* color contribution */ addcolor(r->rcol, p.rcol); - if (refl > trans) - r->rt = r->rot + p.rt; } multcolor(r->rcol, mcolor); /* multiply by transmittance */ @@ -168,13 +168,12 @@ RAY *r; FVECT vt; double tr; { - double sqrt(); RAY sray, *entray; FVECT v1, v2, n1, n2; FVECT dv, v2Xdv; double v2Xdvv2Xdv; - int sn, success = 0; - double omega; + int success = 0; + SRCINDEX si; FVECT vtmp1, vtmp2; double dtmp1, dtmp2; int l1, l2; @@ -236,12 +235,11 @@ double tr; v2Xdvv2Xdv = DOT(v2Xdv, v2Xdv); /* check sources */ - for (sn = 0; sn < nsources; sn++) { + initsrcindex(&si); + while (srcray(&sray, r, &si)) { - if ((omega = srcray(&sray, r, sn)) == 0.0 || - DOT(sray.rdir, v2) < MINCOS) + if (DOT(sray.rdir, v2) < MINCOS) continue; /* bad source */ - /* adjust source ray */ dtmp1 = DOT(v2Xdv, sray.rdir) / v2Xdvv2Xdv; @@ -266,7 +264,7 @@ double tr; */ fcross(vtmp1, v2Xdv, sray.rdir); - dtmp1 = sqrt(omega / v2Xdvv2Xdv / PI); + dtmp1 = sqrt(si.dom / v2Xdvv2Xdv / PI); /* compute first ray */ for (i = 0; i < 3; i++)