ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/source.c
(Generate patch)

Comparing ray/src/rt/source.c (file contents):
Revision 1.7 by greg, Wed Jun 7 15:07:31 1989 UTC vs.
Revision 1.10 by greg, Thu Jun 8 17:04:43 1989 UTC

# Line 286 | Line 286 | register RAY  *r;
286  
287   static int
288   cntcmp(sc1, sc2)                        /* contribution compare (descending) */
289 < register CONTRIB  *sc1, *sc2;
289 > register CNTPTR  *sc1, *sc2;
290   {
291          if (sc1->brt > sc2->brt)
292                  return(-1);
# Line 303 | Line 303 | char  *p;                      /* data for f */
303   {
304          register int  sn;
305          register CONTRIB  *srccnt;
306 <        double  dtmp, hwt, test2, hit2;
306 >        register CNTPTR  *cntord;
307 >        double  prob, ourthresh, hwt, test2, hit2;
308          RAY  sr;
309  
310 <        if ((srccnt = (CONTRIB *)malloc(nsources*sizeof(CONTRIB))) == NULL)
310 >        srccnt = (CONTRIB *)malloc(nsources*sizeof(CONTRIB));
311 >        cntord = (CNTPTR *)malloc(nsources*sizeof(CNTPTR));
312 >        if (srccnt == NULL || cntord == NULL)
313                  error(SYSTEM, "out of memory in direct");
314 +                                                /* modify threshold */
315 +        ourthresh = shadthresh / r->rweight;
316                                                  /* potential contributions */
317          for (sn = 0; sn < nsources; sn++) {
318 <                srccnt[sn].sno = sn;
319 <                setcolor(srccnt[sn].val, 0.0, 0.0, 0.0);
315 <                srccnt[sn].brt = 0.0;
318 >                cntord[sn].sno = sn;
319 >                cntord[sn].brt = 0.0;
320                                                  /* get source ray */
321                  if ((srccnt[sn].dom = srcray(&sr, r, sn)) == 0.0)
322                          continue;
323                  VCOPY(srccnt[sn].dir, sr.rdir);
324                                                  /* compute coefficient */
325                  (*f)(srccnt[sn].val, p, srccnt[sn].dir, srccnt[sn].dom);
326 <                srccnt[sn].brt = bright(srccnt[sn].val);
327 <                if (srccnt[sn].brt <= FTINY)
326 >                cntord[sn].brt = bright(srccnt[sn].val);
327 >                if (cntord[sn].brt <= FTINY)
328                          continue;
329                                                  /* compute intersection */
330                  if (!( source[sn].sflags & SDISTANT ?
# Line 331 | Line 335 | char  *p;                      /* data for f */
335                                                  /* compute contribution */
336                  rayshade(&sr, sr.ro->omod);
337                  multcolor(srccnt[sn].val, sr.rcol);
338 <                srccnt[sn].brt = bright(srccnt[sn].val);
338 >                cntord[sn].brt = bright(srccnt[sn].val);
339          }
340                                                  /* sort contributions */
341 <        qsort(srccnt, nsources, sizeof(CONTRIB), cntcmp);
341 >        qsort(cntord, nsources, sizeof(CNTPTR), cntcmp);
342          hit2 = 0.0; test2 = FTINY;
343                                                  /* test for shadows */
344          for (sn = 0; sn < nsources; sn++) {
345                                                  /* check threshold */
346 <                if (srccnt[sn].brt <= shadthresh*bright(r->rcol)/r->rweight)
346 >                if (cntord[sn].brt <= ourthresh*bright(r->rcol))
347                          break;
348                                                  /* get statistics */
349 <                hwt = (double)source[srccnt[sn].sno].nhits /
350 <                                (double)source[srccnt[sn].sno].ntests;
349 >                hwt = (double)source[cntord[sn].sno].nhits /
350 >                                (double)source[cntord[sn].sno].ntests;
351                  test2 += hwt;
352 <                source[srccnt[sn].sno].ntests++;
352 >                source[cntord[sn].sno].ntests++;
353                                                  /* test for hit */
354                  rayorigin(&sr, r, SHADOW, 1.0);
355 <                VCOPY(sr.rdir, srccnt[sn].dir);
355 >                VCOPY(sr.rdir, srccnt[cntord[sn].sno].dir);
356                  if (localhit(&sr, &thescene) &&
357 <                                sr.ro != source[srccnt[sn].sno].so) {
357 >                                sr.ro != source[cntord[sn].sno].so) {
358                                                  /* check for transmission */
359                          if (sr.clipset != NULL && inset(sr.clipset,sr.ro->omod))
360                                  raytrans(&sr);          /* object is clipped */
# Line 358 | Line 362 | char  *p;                      /* data for f */
362                                  rayshade(&sr, sr.ro->omod);
363                          if (bright(sr.rcol) <= FTINY)
364                                  continue;       /* missed! */
365 <                        (*f)(srccnt[sn].val, p, srccnt[sn].dir, srccnt[sn].dom);
366 <                        multcolor(srccnt[sn].val, sr.rcol);
365 >                        (*f)(srccnt[cntord[sn].sno].val, p,
366 >                                        srccnt[cntord[sn].sno].dir,
367 >                                        srccnt[cntord[sn].sno].dom);
368 >                        multcolor(srccnt[cntord[sn].sno].val, sr.rcol);
369                  }
370                                                  /* add contribution if hit */
371 <                addcolor(r->rcol, srccnt[sn].val);
371 >                addcolor(r->rcol, srccnt[cntord[sn].sno].val);
372                  hit2 += hwt;
373 <                source[srccnt[sn].sno].nhits++;
373 >                source[cntord[sn].sno].nhits++;
374          }
375                                          /* weighted hit rate */
376          hwt = hit2 / test2;
# Line 374 | Line 380 | char  *p;                      /* data for f */
380   #endif
381                                          /* add in untested sources */
382          for ( ; sn < nsources; sn++) {
383 <                if (srccnt[sn].brt <= 0.0)
383 >                if (cntord[sn].brt <= 0.0)
384                          break;
385 <                dtmp = hwt * (double)source[srccnt[sn].sno].nhits /
386 <                                (double)source[srccnt[sn].sno].ntests;
387 <                scalecolor(srccnt[sn].val, dtmp);
388 <                addcolor(r->rcol, srccnt[sn].val);
385 >                prob = hwt * (double)source[cntord[sn].sno].nhits /
386 >                                (double)source[cntord[sn].sno].ntests;
387 >                scalecolor(srccnt[cntord[sn].sno].val, prob);
388 >                addcolor(r->rcol, srccnt[cntord[sn].sno].val);
389          }
390   #ifdef DEBUG
391          fprintf(stderr, "%d tested, %d untested, %f hit rate\n",
# Line 388 | Line 394 | char  *p;                      /* data for f */
394   #endif
395                  
396          free(srccnt);
397 +        free(cntord);
398   }
399  
400  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines