--- ray/src/rt/source.c 1993/12/21 15:46:19 2.13 +++ ray/src/rt/source.c 1995/11/02 17:37:58 2.17 @@ -1,4 +1,4 @@ -/* Copyright (c) 1993 Regents of the University of California */ +/* Copyright (c) 1995 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -68,6 +68,9 @@ marksources() /* find and mark source objects */ o->otype != OBJ_SOURCE && m->oargs.farg[3] <= FTINY) continue; /* don't bother */ + if (m->oargs.farg[0] <= FTINY && m->oargs.farg[1] <= FTINY && + m->oargs.farg[2] <= FTINY) + continue; /* don't bother */ if (sfun[o->otype].of == NULL || sfun[o->otype].of->setsrc == NULL) @@ -152,7 +155,7 @@ SRCINDEX *si; /* source sample index */ srcvalue(r) /* punch ray to source and compute value */ -RAY *r; +register RAY *r; { register SRCREC *sp; @@ -161,7 +164,8 @@ RAY *r; /* check intersection */ if (!(*ofun[sp->so->otype].funp)(sp->so, r)) return; - raycont(r); /* compute contribution */ + if (!rayshade(r, r->ro->omod)) /* compute contribution */ + goto nomat; return; } /* compute intersection */ @@ -169,9 +173,11 @@ RAY *r; (*ofun[sp->so->otype].funp)(sp->so, r)) { if (sp->sa.success >= 0) sp->sa.success++; - raycont(r); /* compute contribution */ + if (!rayshade(r, r->ro->omod)) /* compute contribution */ + goto nomat; return; } + /* we missed our mark! */ if (sp->sa.success < 0) return; /* bitched already */ sp->sa.success -= AIMREQT; @@ -180,6 +186,9 @@ RAY *r; sprintf(errmsg, "aiming failure for light source \"%s\"", sp->so->oname); error(WARNING, errmsg); /* issue warning */ + return; +nomat: + objerror(r->ro, USER, "material not found"); } @@ -318,7 +327,8 @@ char *p; /* data for f */ ( sr.ro != source[scp->sno].so || source[scp->sno].sflags & SFOLLOW )) { /* follow entire path */ - raycont(&sr); + if (!raycont(&sr)) + objerror(sr.ro, USER, "material not found"); if (trace != NULL) (*trace)(&sr); /* trace execution */ if (bright(sr.rcol) <= FTINY) @@ -395,9 +405,9 @@ return(o->otype==MAT_ILLUM|o->otype==MAT_GLOW);} * (Glows with negative radii should NEVER participate in illumination.) */ -#define distglow(m, r) (m->otype==MAT_GLOW && \ +#define distglow(m, r, d) (m->otype==MAT_GLOW && \ m->oargs.farg[3] >= -FTINY && \ - r->rot > m->oargs.farg[3]) + d > m->oargs.farg[3]) /* badcomponent * * @@ -410,7 +420,7 @@ return(o->otype==MAT_ILLUM|o->otype==MAT_GLOW);} #define badcomponent(m, r) (r->crtype&(AMBIENT|SPECULAR) && \ !(r->crtype&SHADOW || r->rod < 0.0 || \ - distglow(m, r))) + /* not 100% correct */ distglow(m, r, r->rot))) /* passillum * * @@ -428,8 +438,8 @@ return(o->otype==MAT_ILLUM|o->otype==MAT_GLOW);} * The -dv flag is normally on for sources to be visible. */ -#define srcignore(m, r) (!directvis && !(r->crtype&SHADOW) && \ - !distglow(m, r)) +#define srcignore(m, r) !(directvis || r->crtype&SHADOW || \ + distglow(m, r, raydist(r,PRIMARY))) m_light(m, r) /* ray hit a light source */ @@ -438,27 +448,26 @@ register RAY *r; { /* check for over-counting */ if (badcomponent(m, r)) - return; - if (wrongsource(m,r)) - return; + return(1); + if (wrongsource(m, r)) + return(1); /* check for passed illum */ if (passillum(m, r)) { - if (m->oargs.nsargs < 1 || !strcmp(m->oargs.sarg[0], VOIDID)) - raytrans(r); - else - rayshade(r, modifier(m->oargs.sarg[0])); - return; + if (m->oargs.nsargs && strcmp(m->oargs.sarg[0], VOIDID)) + return(rayshade(r, modifier(m->oargs.sarg[0]))); + raytrans(r); + return(1); } /* otherwise treat as source */ /* check for behind */ if (r->rod < 0.0) - return; + return(1); /* check for invisibility */ if (srcignore(m, r)) - return; + return(1); /* check for outside spot */ if (m->otype==MAT_SPOT && spotout(r, makespot(m), r->rot>=FHUGE)) - return; + return(1); /* get distribution pattern */ raytexture(r, m->omod); /* get source color */ @@ -467,4 +476,5 @@ register RAY *r; m->oargs.farg[2]); /* modify value */ multcolor(r->rcol, r->pcol); + return(1); }