1 |
< |
/* Copyright (c) 1993 Regents of the University of California */ |
1 |
> |
/* Copyright (c) 1995 Regents of the University of California */ |
2 |
|
|
3 |
|
#ifndef lint |
4 |
|
static char SCCSid[] = "$SunId$ LBL"; |
131 |
|
sr->rsrc = si->sn; /* remember source */ |
132 |
|
srcp = source + si->sn; |
133 |
|
if (srcp->sflags & SDISTANT) { |
134 |
< |
if (srcp->sflags & SSPOT && spotout(sr, srcp->sl.s, 1)) |
134 |
> |
if (srcp->sflags & SSPOT && spotout(sr, srcp->sl.s)) |
135 |
|
continue; |
136 |
|
return(1); /* sample OK */ |
137 |
|
} |
141 |
|
continue; |
142 |
|
/* check angle */ |
143 |
|
if (srcp->sflags & SSPOT) { |
144 |
< |
if (spotout(sr, srcp->sl.s, 0)) |
144 |
> |
if (spotout(sr, srcp->sl.s)) |
145 |
|
continue; |
146 |
|
/* adjust solid angle */ |
147 |
|
si->dom *= d*d; |
405 |
|
* (Glows with negative radii should NEVER participate in illumination.) |
406 |
|
*/ |
407 |
|
|
408 |
< |
#define distglow(m, r) (m->otype==MAT_GLOW && \ |
408 |
> |
#define distglow(m, r, d) (m->otype==MAT_GLOW && \ |
409 |
|
m->oargs.farg[3] >= -FTINY && \ |
410 |
< |
r->rot > m->oargs.farg[3]) |
410 |
> |
d > m->oargs.farg[3]) |
411 |
|
|
412 |
|
/* badcomponent * |
413 |
|
* |
420 |
|
|
421 |
|
#define badcomponent(m, r) (r->crtype&(AMBIENT|SPECULAR) && \ |
422 |
|
!(r->crtype&SHADOW || r->rod < 0.0 || \ |
423 |
< |
distglow(m, r))) |
423 |
> |
/* not 100% correct */ distglow(m, r, r->rot))) |
424 |
|
|
425 |
|
/* passillum * |
426 |
|
* |
438 |
|
* The -dv flag is normally on for sources to be visible. |
439 |
|
*/ |
440 |
|
|
441 |
< |
#define srcignore(m, r) (!directvis && !(r->crtype&SHADOW) && \ |
442 |
< |
!distglow(m, r)) |
441 |
> |
#define srcignore(m, r) !(directvis || r->crtype&SHADOW || \ |
442 |
> |
distglow(m, r, raydist(r,PRIMARY))) |
443 |
|
|
444 |
|
|
445 |
|
m_light(m, r) /* ray hit a light source */ |
449 |
|
/* check for over-counting */ |
450 |
|
if (badcomponent(m, r)) |
451 |
|
return(1); |
452 |
< |
if (wrongsource(m,r)) |
452 |
> |
if (wrongsource(m, r)) |
453 |
|
return(1); |
454 |
|
/* check for passed illum */ |
455 |
|
if (passillum(m, r)) { |
466 |
|
if (srcignore(m, r)) |
467 |
|
return(1); |
468 |
|
/* check for outside spot */ |
469 |
< |
if (m->otype==MAT_SPOT && spotout(r, makespot(m), r->rot>=FHUGE)) |
469 |
> |
if (m->otype==MAT_SPOT && spotout(r, makespot(m))) |
470 |
|
return(1); |
471 |
|
/* get distribution pattern */ |
472 |
|
raytexture(r, m->omod); |