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 1.16 by greg, Fri Nov 8 16:34:24 1991 UTC

# 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 + /* badambient *
539 + *
540 + * We must avoid including 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 + */
544 +
545   #define  badambient(m, r)       ((r->crtype&(AMBIENT|SHADOW))==AMBIENT && \
546                                  !distglow(m, r))
547  
548 + /* passillum *
549 + *
550 + * An illum passes to another material type when we didn't hit it
551 + * on purpose (as part of a direct calculation), or it is relaying
552 + * a virtual light source.
553 + */
554 +
555   #define  passillum(m, r)        (m->otype==MAT_ILLUM && \
556 <                                !(r->rsrc>=0&&source[r->rsrc].so==r->ro))
556 >                                (r->rsrc<0 || source[r->rsrc].so!=r->ro || \
557 >                                source[r->rsrc].sflags&SVIRTUAL))
558 >
559 > /* srcignore *
560 > *
561 > * The -di flag renders light sources invisible, and here is the test.
562 > */
563  
564   #define  srcignore(m, r)        (directinvis && !(r->crtype&SHADOW) && \
565                                  !distglow(m, r))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines