--- ray/src/rt/srcsamp.c 1991/11/12 17:10:39 2.1 +++ ray/src/rt/srcsamp.c 1994/07/20 12:48:44 2.6 @@ -15,6 +15,9 @@ static char SCCSid[] = "$SunId$ LBL"; #include "random.h" +static int cyl_partit(), flt_partit(); + + double nextssamp(r, si) /* compute sample for source, rtn. distance */ register RAY *r; /* origin is read, direction is set */ @@ -24,7 +27,7 @@ register SRCINDEX *si; /* source index (modified to FVECT vpos; double d; register int i; - +nextsample: while (++si->sp >= si->np) { /* get next sample */ if (++si->sn >= nsources) return(0.0); /* no more */ @@ -76,23 +79,26 @@ register SRCINDEX *si; /* source index (modified to r->rdir[i] -= r->rorg[i]; /* compute distance */ if ((d = normalize(r->rdir)) == 0.0) - return(nextssamp(r, si)); /* at source! */ + goto nextsample; /* at source! */ /* compute sample size */ - si->dom = source[si->sn].ss2; if (source[si->sn].sflags & SFLAT) { - si->dom *= sflatform(si->sn, r->rdir); - si->dom *= (double)(size[SU]*size[SV])/(MAXSPART*MAXSPART); + si->dom = sflatform(si->sn, r->rdir); + si->dom *= size[SU]*size[SV]/(MAXSPART*(double)MAXSPART); } else if (source[si->sn].sflags & SCYL) { - si->dom *= scylform(si->sn, r->rdir); - si->dom *= (double)size[SU]/MAXSPART; + si->dom = scylform(si->sn, r->rdir); + si->dom *= size[SU]/(double)MAXSPART; } else { - si->dom *= (double)(size[SU]*size[SV]*size[SW]) / - (MAXSPART*MAXSPART*MAXSPART) ; + si->dom = size[SU]*size[SV]*(double)size[SW] / + (MAXSPART*MAXSPART*(double)MAXSPART) ; } - if (source[si->sn].sflags & SDISTANT) + if (source[si->sn].sflags & SDISTANT) { + si->dom *= source[si->sn].ss2; return(FHUGE); - si->dom /= d*d; + } + if (si->dom <= 1e-4) + goto nextsample; /* behind source? */ + si->dom *= source[si->sn].ss2/(d*d); return(d); /* sample OK, return distance */ }