--- ray/src/rt/virtuals.c 1991/07/30 18:23:45 1.19 +++ ray/src/rt/virtuals.c 1991/08/26 10:10:43 1.26 @@ -19,8 +19,8 @@ static char SCCSid[] = "$SunId$ LBL"; #include "random.h" -#define MINSAMPLES 5 /* minimum number of pretest samples */ -#define STESTMAX 30 /* maximum seeks per sample */ +#define MINSAMPLES 16 /* minimum number of pretest samples */ +#define STESTMAX 32 /* maximum seeks per sample */ double getdisk(); @@ -44,8 +44,10 @@ markvirtuals() /* find and mark virtual sources */ if (!isvlight(objptr(o->omod)->otype)) continue; if (sfun[o->otype].of == NULL || - sfun[o->otype].of->getpleq == NULL) - objerror(o, USER, "illegal material"); + sfun[o->otype].of->getpleq == NULL) { + objerror(o,WARNING,"secondary sources not supported"); + continue; + } if (nvobjects == 0) vobject = (OBJECT *)malloc(sizeof(OBJECT)); else @@ -199,7 +201,7 @@ MAT4 pm; if (source[sn].sflags & SFLAT) { /* behind source? */ multv3(nsnorm, source[sn].snorm, pm); normalize(nsnorm); - if (!checkspot(&ourspot, nsnorm)) + if (nsflags & SSPOT && !checkspot(&ourspot, nsnorm)) return(-1); } } @@ -285,13 +287,17 @@ register int sn; /* target source number */ getplaneq(onorm, o); /* set number of rays to sample */ if (source[sn].sflags & SDISTANT) { - n = (2./3.*PI*PI)*or2/(thescene.cusize*thescene.cusize)* - vspretest + .5; + /* 32. == heuristic constant */ + n = 32.*or2/(thescene.cusize*thescene.cusize)*vspretest + .5; infront = DOT(onorm, source[sn].sloc) > 0.; } else { for (i = 0; i < 3; i++) offsdir[i] = source[sn].sloc[i] - oc[i]; - n = or2/DOT(offsdir,offsdir)*vspretest + .5; + d = DOT(offsdir,offsdir); + if (d <= FTINY) + n = 2.*PI * vspretest + .5; + else + n = 2.*PI * (1.-sqrt(1./(1.+or2/d)))*vspretest + .5; infront = DOT(onorm, offsdir) > 0.; } if (n < MINSAMPLES) n = MINSAMPLES; @@ -313,9 +319,9 @@ register int sn; /* target source number */ #endif return(f); /* too small a target! */ } + multisamp(offsdir, 3, urand(sn*931+5827+ssn)); for (i = 0; i < 3; i++) - offsdir[i] = or*(1. - - 2.*urand(urind(931*i+5827,ssn))); + offsdir[i] = or*(1. - 2.*offsdir[i]); ssn++; for (i = 0; i < 3; i++) sr.rorg[i] = oc[i] + offsdir[i]; @@ -343,9 +349,7 @@ register int sn; /* target source number */ nok++; /* check against obstructions */ rayclear(&sr); - sr.revf = raytrace; - rayvalue(&sr); - if (bright(sr.rcol) > FTINY) + if (!localhit(&sr, &thescene) || sr.ro == source[sn].so) nhit++; if (nhit > 0 && nhit < nok) { #ifdef DEBUG