--- ray/src/rt/source.c 1990/12/28 20:37:08 1.29 +++ ray/src/rt/source.c 1991/06/14 14:58:49 1.32 @@ -109,6 +109,7 @@ register OBJREC *so; register int i; src->sflags = 0; + src->aimsuccess = 2*AIMREQT-1; /* bitch on second failure */ src->nhits = 1; src->ntests = 2; /* start probability = 1/2 */ src->so = so; @@ -214,9 +215,13 @@ register int sn; /* source number */ } if (dstrsrc > FTINY) { /* distribute source direction */ - for (i = 0; i < 3; i++) - vd[i] = dstrsrc * source[sn].ss * (1.0 - 2.0*frandom()); - + dimlist[ndims++] = sn; + for (i = 0; i < 3; i++) { + dimlist[ndims] = i + 8831; + vd[i] = dstrsrc * source[sn].ss * + (1.0 - 2.0*urand(ilhash(dimlist,ndims+1)+samplendx)); + } + ndims--; if (norm != NULL) { /* project offset */ d = DOT(vd, norm); for (i = 0; i < 3; i++) @@ -337,15 +342,23 @@ char *p; /* data for f */ if (cntord[sn].brt <= 0.0) continue; /* compute intersection */ - if (!( source[sn].sflags & SDISTANT ? + if (source[sn].sflags & SDISTANT ? sourcehit(&sr) : (*ofun[source[sn].so->otype].funp) - (source[sn].so, &sr) )) { + (source[sn].so, &sr)) { + if (source[sn].aimsuccess >= 0) + source[sn].aimsuccess++; + } else { + cntord[sn].brt = 0.0; + if (source[sn].aimsuccess < 0) + continue; /* bitched already */ + source[sn].aimsuccess -= AIMREQT; + if (source[sn].aimsuccess >= 0) + continue; /* leniency */ sprintf(errmsg, "aiming failure for light source \"%s\"", source[sn].so->oname); error(WARNING, errmsg); - cntord[sn].brt = 0.0; continue; } /* compute contribution */ @@ -460,7 +473,5 @@ register RAY *r; m->oargs.farg[2]); /* modify value */ multcolor(r->rcol, r->pcol); - /* assign distance */ - r->rt = r->rot; } }