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

Comparing ray/src/rt/srcsupp.c (file contents):
Revision 1.15 by greg, Tue Oct 22 11:23:47 1991 UTC vs.
Revision 2.3 by greg, Wed Jan 15 16:54:50 1992 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1991 Regents of the University of California */
1 > /* Copyright (c) 1992 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 500 | Line 500 | register RAY  *r;
500   }
501  
502  
503 < #define  wrongsource(m, r)      (r->rsrc>=0 && \
504 <                                source[r->rsrc].so!=r->ro && \
505 <                                (m->otype!=MAT_ILLUM || \
506 <                        objptr(source[r->rsrc].so->omod)->otype==MAT_ILLUM))
503 > /****************************************************************
504 > * The following macros were separated from the m_light() routine
505 > * because they are very nasty and difficult to understand.
506 > */
507  
508 + /* wrongillum *
509 + *
510 + * We cannot allow an illum to pass to another illum, because that
511 + * would almost certainly constitute overcounting.
512 + * However, we do allow an illum to pass to another illum
513 + * that is actually going to relay to a virtual light source.
514 + */
515 +
516 + #define  wrongillum(m, r)       (!(source[r->rsrc].sflags&SVIRTUAL) && \
517 +                        objptr(source[r->rsrc].so->omod)->otype==MAT_ILLUM)
518 +
519 + /* wrongsource *
520 + *
521 + * This source is the wrong source (ie. overcounted) if we are
522 + * aimed to a different source than the one we hit and the one
523 + * we hit is not an illum which should be passed.
524 + */
525 +
526 + #define  wrongsource(m, r)      (r->rsrc>=0 && source[r->rsrc].so!=r->ro && \
527 +                                (m->otype!=MAT_ILLUM || wrongillum(m,r)))
528 +
529 + /* distglow *
530 + *
531 + * A distant glow is an object that sometimes acts as a light source,
532 + * but is too far away from the test point to be one in this case.
533 + */
534 +
535   #define  distglow(m, r)         (m->otype==MAT_GLOW && \
536                                  r->rot > m->oargs.farg[3])
537  
538 < #define  badambient(m, r)       ((r->crtype&(AMBIENT|SHADOW))==AMBIENT && \
539 <                                !distglow(m, r))
538 > /* badcomponent *
539 > *
540 > * We must avoid counting light sources in the ambient calculation,
541 > * since the direct component is handled separately.  Therefore, any
542 > * ambient ray which hits an active light source must be discarded.
543 > * The same is true for stray specular samples, since the specular
544 > * contribution from light sources is calculated separately.
545 > */
546  
547 + #define  badcomponent(m, r)     (r->crtype&(AMBIENT|SPECULAR) && \
548 +                                !(r->crtype&SHADOW || distglow(m, r)))
549 +
550 + /* overcount *
551 + *
552 + * All overcounting possibilities are contained here.
553 + */
554 +
555 + #define  overcount(m, r)        (badcomponent(m,r) || wrongsource(m,r))
556 +
557 + /* passillum *
558 + *
559 + * An illum passes to another material type when we didn't hit it
560 + * on purpose (as part of a direct calculation), or it is relaying
561 + * a virtual light source.
562 + */
563 +
564   #define  passillum(m, r)        (m->otype==MAT_ILLUM && \
565 <                                !(r->rsrc>=0&&source[r->rsrc].so==r->ro))
565 >                                (r->rsrc<0 || source[r->rsrc].so!=r->ro || \
566 >                                source[r->rsrc].sflags&SVIRTUAL))
567  
568 + /* srcignore *
569 + *
570 + * The -di flag renders light sources invisible, and here is the test.
571 + */
572 +
573   #define  srcignore(m, r)        (directinvis && !(r->crtype&SHADOW) && \
574                                  !distglow(m, r))
575  
# Line 523 | Line 579 | register OBJREC  *m;
579   register RAY  *r;
580   {
581                                                  /* check for over-counting */
582 <        if (wrongsource(m, r) || badambient(m, r))
582 >        if (overcount(m, r))
583                  return;
584                                                  /* check for passed illum */
585          if (passillum(m, r)) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines