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 2.79 by greg, Wed Jun 8 17:18:41 2022 UTC vs.
Revision 2.86 by greg, Sat Jan 18 03:49:00 2025 UTC

# Line 27 | Line 27 | static const char RCSid[] = "$Id$";
27   typedef struct {
28          int  sno;               /* source number */
29          FVECT  dir;             /* source direction */
30 <        COLOR  coef;            /* material coefficient */
31 <        COLOR  val;             /* contribution */
30 >        SCOLOR  coef;           /* material coefficient */
31 >        SCOLOR  val;            /* contribution */
32   }  CONTRIB;             /* direct contribution */
33  
34   typedef struct {
# Line 200 | Line 200 | freesources(void)                      /* free all source structures */
200                  while (nsources--)
201                          freeobscache(&source[nsources]);
202   #endif
203 <                free((void *)source);
203 >                free(source);
204                  source = NULL;
205                  nsources = 0;
206          }
207          markclip(NULL);
208          if (maxcntr <= 0)
209                  return;
210 <        free((void *)srccnt);
210 >        free(srccnt);
211          srccnt = NULL;
212 <        free((void *)cntord);
212 >        free(cntord);
213          cntord = NULL;
214          maxcntr = 0;
215   }
216  
217  
218   int
219 < srcray(                         /* send a ray to a source, return domega */
220 <        RAY  *sr,               /* returned source ray */
221 <        RAY  *r,                        /* ray which hit object */
219 > srcray(                         /* aim a ray at a source, return domega */
220 >        RAY  *sr,               /* prepared source ray */
221 >        RAY  *r,                        /* originating ray (or NULL) */
222          SRCINDEX  *si                   /* source sample index */
223   )
224   {
# Line 231 | Line 231 | srcray(                                /* send a ray to a source, return domega */
231                  sr->rmax = 0.0;
232  
233          while ((d = nextssamp(sr, si)) != 0.0) {
234 <                sr->rsrc = si->sn;                      /* remember source */
234 >                sr->rsrc = si->sn;              /* remember source */
235                  srcp = source + si->sn;
236                  if (srcp->sflags & SDISTANT) {
237                          if (srcp->sflags & SSPOT && spotout(sr, srcp->sl.s))
# Line 435 | Line 435 | direct(                                        /* add direct component */
435                  scp->sno = sr.rsrc;
436   #if SHADCACHE                                   /* check shadow cache */
437                  if (si.np == 1 && srcblocked(&sr)) {
438 <                        cntord[sn].brt = 0.0;
438 >                        cntord[sn].brt = 0.0;   /* & count as test */
439 >                        if (source[scp->sno].ntests++ > 0xfffffff0) {
440 >                                source[scp->sno].ntests >>= 1;
441 >                                source[scp->sno].nhits >>= 1;
442 >                        }
443                          continue;
444                  }
445   #endif
446                                                  /* compute coefficient */
447                  (*f)(scp->coef, p, sr.rdir, si.dom);
448 <                cntord[sn].brt = intens(scp->coef);
448 >                cntord[sn].brt = sintens(scp->coef);
449                  if (cntord[sn].brt <= 0.0)
450                          continue;
451                  VCOPY(scp->dir, sr.rdir);
452 <                copycolor(sr.rcoef, scp->coef);
452 >                copyscolor(sr.rcoef, scp->coef);
453                                                  /* compute potential */
454                  sr.revf = srcvalue;
455                  rayvalue(&sr);
456 <                multcolor(sr.rcol, sr.rcoef);
457 <                copycolor(scp->val, sr.rcol);
458 <                cntord[sn].brt = bright(sr.rcol);
456 >                smultscolor(sr.rcol, sr.rcoef);
457 >                copyscolor(scp->val, sr.rcol);
458 >                cntord[sn].brt = pbright(sr.rcol);
459          }
460                                                  /* sort contributions */
461          qsort(cntord, sn, sizeof(CNTPTR), cntcmp);
# Line 486 | Line 490 | direct(                                        /* add direct component */
490                  if (sn >= MINSHADCNT &&
491                              (sn+nshadcheck>=ncnts ? cntord[sn].brt :
492                                  cntord[sn].brt-cntord[sn+nshadcheck].brt)
493 <                                        < ourthresh*bright(r->rcol))
493 >                                        < ourthresh*pbright(r->rcol))
494                          break;
495                  scp = srccnt + cntord[sn].sndx;
496                                                  /* test for hit */
497 <                rayorigin(&sr, SHADOW, r, NULL);
498 <                copycolor(sr.rcoef, scp->coef);
497 >                rayorigin(&sr, thrudir(r,scp->dir) ? TSHADOW : RSHADOW, r, NULL);
498 >                copyscolor(sr.rcoef, scp->coef);
499                  VCOPY(sr.rdir, scp->dir);
500                  sr.rsrc = scp->sno;
501                                                  /* keep statistics */
# Line 506 | Line 510 | direct(                                        /* add direct component */
510                          raycont(&sr);
511                          if (trace != NULL)
512                                  (*trace)(&sr);  /* trace execution */
513 <                        if (bright(sr.rcol) <= FTINY) {
513 >                        if (scolor_mean(sr.rcol) <= FTINY) {
514   #if SHADCACHE
515                                  if ((scp <= srccnt || scp[-1].sno != scp->sno)
516                                                  && (scp >= srccnt+ncnts-1 ||
# Line 516 | Line 520 | direct(                                        /* add direct component */
520                                  continue;       /* missed! */
521                          }
522                          rayparticipate(&sr);
523 <                        multcolor(sr.rcol, sr.rcoef);
524 <                        copycolor(scp->val, sr.rcol);
523 >                        smultscolor(sr.rcol, sr.rcoef);
524 >                        copyscolor(scp->val, sr.rcol);
525                  } else if (trace != NULL &&
526                          (source[scp->sno].sflags & (SDISTANT|SVIRTUAL|SFOLLOW))
527                                                  == (SDISTANT|SFOLLOW) &&
# Line 526 | Line 530 | direct(                                        /* add direct component */
530                          /* skip call to rayparticipate() & scp->val update */
531                  }
532                                                  /* add contribution if hit */
533 <                addcolor(r->rcol, scp->val);
533 >                saddscolor(r->rcol, scp->val);
534                  nhits++;
535                  source[scp->sno].nhits++;
536          }
# Line 546 | Line 550 | direct(                                        /* add direct component */
550                  prob = hwt * (double)source[scp->sno].nhits /
551                                  (double)source[scp->sno].ntests;
552                  if (prob < 1.0)
553 <                        scalecolor(scp->val, prob);
554 <                addcolor(r->rcol, scp->val);
553 >                        scalescolor(scp->val, prob);
554 >                saddscolor(r->rcol, scp->val);
555          }
556   }
557  
# Line 592 | Line 596 | srcscatter(                    /* compute source scattering into ray */
596                          setcolor(cvext, re > 92. ? 0. : exp(-re),
597                                          ge > 92. ? 0. : exp(-ge),
598                                          be > 92. ? 0. : exp(-be));
599 <                        if (intens(cvext) <= FTINY)
599 >                        if (intens(cvext) <= FTINY*FTINY)
600                                  break;                  /* too far away */
601                          sr.rorg[0] = r->rorg[0] + r->rdir[0]*t;
602                          sr.rorg[1] = r->rorg[1] + r->rdir[1]*t;
603                          sr.rorg[2] = r->rorg[2] + r->rdir[2]*t;
604                          
605                          if (!volumePhotonMapping) {
606 +                                sr.parent = r;          /* hack for preemptive test */
607 +                                if (srcskip(r->slights[i], &sr))
608 +                                        continue;
609                                  initsrcindex(&si);      /* sample ray to this source */
610                                  si.sn = r->slights[i];
611                                  nopart(&si, &sr);
# Line 614 | Line 621 | srcscatter(                    /* compute source scattering into ray */
621                                  sr.gecc = r->gecc;
622                                  sr.slights = r->slights;
623                                  rayvalue(&sr);          /* eval. source ray */
624 <                                if (bright(sr.rcol) <= FTINY) {
624 >                                if (pbright(sr.rcol) <= FTINY) {
625   #if SHADCACHE
626                                          srcblocker(&sr); /* add blocker to cache */
627   #endif
# Line 629 | Line 636 | srcscatter(                    /* compute source scattering into ray */
636                                  }
637                                                          /* other factors */
638                                  d *= si.dom * r->rot / (4.*PI*nsamps);
639 <                                scalecolor(sr.rcol, d);
639 >                                scalescolor(sr.rcol, d);
640                          } else {
641                                  /* PMAP: Add ambient inscattering from
642                                   * volume photons; note we reverse the
# Line 640 | Line 647 | srcscatter(                    /* compute source scattering into ray */
647                                  sr.rdir [2] = -r -> rdir [2];
648                                  sr.gecc = r -> gecc;
649                                  inscatterVolumePmap(&sr, sr.rcol);
650 <                                scalecolor(sr.rcol, r -> rot / nsamps);
650 >                                scalescolor(sr.rcol, r -> rot / nsamps);
651                          }
652 <                        multcolor(sr.rcol, r->cext);
653 <                        multcolor(sr.rcol, r->albedo);
654 <                        multcolor(sr.rcol, cvext);
655 <                        addcolor(r->rcol, sr.rcol);     /* add it in */
652 >                        smultcolor(sr.rcol, r->cext);
653 >                        smultcolor(sr.rcol, r->albedo);
654 >                        smultcolor(sr.rcol, cvext);
655 >                        saddscolor(r->rcol, sr.rcol);   /* add it in */
656                  }
657          }
658          samplendx = oldsampndx;
# Line 746 | Line 753 | m_light(                               /* ray hit a light source */
753   {
754                                                  /* check for over-counting */
755          if (badcomponent(m, r)) {
756 <                setcolor(r->rcoef, 0.0, 0.0, 0.0);
756 >                scolorblack(r->rcoef);
757                  return(1);
758          }
759          if (wrongsource(m, r)) {
760 <                setcolor(r->rcoef, 0.0, 0.0, 0.0);
760 >                scolorblack(r->rcoef);
761                  return(1);
762          }
763                                                  /* check for passed illum */
# Line 762 | Line 769 | m_light(                               /* ray hit a light source */
769          }
770                                                  /* check for invisibility */
771          if (srcignore(m, r)) {
772 <                setcolor(r->rcoef, 0.0, 0.0, 0.0);
772 >                scolorblack(r->rcoef);
773                  return(1);
774          }
775                                          /* otherwise treat as source */
# Line 777 | Line 784 | m_light(                               /* ray hit a light source */
784                                                  /* get distribution pattern */
785          raytexture(r, m->omod);
786                                                  /* get source color */
787 <        setcolor(r->rcol, m->oargs.farg[0],
787 >        setscolor(r->rcol, m->oargs.farg[0],
788                            m->oargs.farg[1],
789                            m->oargs.farg[2]);
790                                                  /* modify value */
791 <        multcolor(r->rcol, r->pcol);
791 >        smultscolor(r->rcol, r->pcol);
792          return(1);
793   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines