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.56 by greg, Wed Jul 25 04:12:36 2007 UTC vs.
Revision 2.61 by greg, Tue Aug 2 22:47:30 2011 UTC

# Line 99 | Line 99 | marksources(void)                      /* find and mark source objects */
99                                  m->otype == MAT_SPOT ? 7 : 3))
100                          objerror(m, USER, "bad # arguments");
101  
102                if (m->otype == MAT_GLOW &&
103                                o->otype != OBJ_SOURCE &&
104                                m->oargs.farg[3] <= FTINY)
105                        continue;                       /* don't bother */
102                  if (m->oargs.farg[0] <= FTINY && m->oargs.farg[1] <= FTINY &&
103                                  m->oargs.farg[2] <= FTINY)
104                          continue;                       /* don't bother */
105 <
105 >                if (m->otype == MAT_GLOW &&
106 >                                o->otype != OBJ_SOURCE &&
107 >                                m->oargs.farg[3] <= FTINY) {
108 >                        foundsource += (ambounce > 0);
109 >                        continue;                       /* don't track these */
110 >                }
111                  if (sfun[o->otype].of == NULL ||
112                                  sfun[o->otype].of->setsrc == NULL)
113                          objerror(o, USER, "illegal material");
# Line 119 | Line 120 | marksources(void)                      /* find and mark source objects */
120                  if (m->otype == MAT_GLOW) {
121                          source[ns].sflags |= SPROX;
122                          source[ns].sl.prox = m->oargs.farg[3];
123 <                        if (source[ns].sflags & SDISTANT)
123 >                        if (source[ns].sflags & SDISTANT) {
124                                  source[ns].sflags |= SSKIP;
125 +                                foundsource += (ambounce > 0);
126 +                        }
127                  } else if (m->otype == MAT_SPOT) {
128                          source[ns].sflags |= SSPOT;
129                          if ((source[ns].sl.s = makespot(m)) == NULL)
# Line 135 | Line 138 | marksources(void)                      /* find and mark source objects */
138   #if  SHADCACHE
139                  initobscache(ns);
140   #endif
141 <                if (!(source[ns].sflags & SSKIP))
139 <                        foundsource++;
141 >                foundsource += !(source[ns].sflags & SSKIP);
142          }
143          if (!foundsource) {
144                  error(WARNING, "no light sources found");
# Line 167 | Line 169 | freesources(void)                      /* free all source structures */
169                  source = NULL;
170                  nsources = 0;
171          }
172 +        markclip(NULL);
173          if (maxcntr <= 0)
174                  return;
175          free((void *)srccnt);
# Line 184 | Line 187 | srcray(                                /* send a ray to a source, return domega */
187          SRCINDEX  *si                   /* source sample index */
188   )
189   {
190 <    double  d;                          /* distance to source */
191 <    register SRCREC  *srcp;
190 >        double  d;                              /* distance to source */
191 >        register SRCREC  *srcp;
192  
193 <    rayorigin(sr, SHADOW, r, NULL);             /* ignore limits */
193 >        rayorigin(sr, SHADOW, r, NULL);         /* ignore limits */
194  
195 <    while ((d = nextssamp(sr, si)) != 0.0) {
196 <        sr->rsrc = si->sn;                      /* remember source */
197 <        srcp = source + si->sn;
198 <        if (srcp->sflags & SDISTANT) {
199 <                if (srcp->sflags & SSPOT && spotout(sr, srcp->sl.s))
200 <                        continue;
201 <                return(1);              /* sample OK */
202 <        }
195 >        if (r == NULL)
196 >                sr->rmax = 0.0;
197 >
198 >        while ((d = nextssamp(sr, si)) != 0.0) {
199 >                sr->rsrc = si->sn;                      /* remember source */
200 >                srcp = source + si->sn;
201 >                if (srcp->sflags & SDISTANT) {
202 >                        if (srcp->sflags & SSPOT && spotout(sr, srcp->sl.s))
203 >                                continue;
204 >                        return(1);              /* sample OK */
205 >                }
206                                  /* local source */
207                                                  /* check proximity */
208 <        if (srcp->sflags & SPROX && d > srcp->sl.prox)
203 <                continue;
204 <                                                /* check angle */
205 <        if (srcp->sflags & SSPOT) {
206 <                if (spotout(sr, srcp->sl.s))
208 >                if (srcp->sflags & SPROX && d > srcp->sl.prox)
209                          continue;
210 +                                                /* check angle */
211 +                if (srcp->sflags & SSPOT) {
212 +                        if (spotout(sr, srcp->sl.s))
213 +                                continue;
214                                          /* adjust solid angle */
215 <                si->dom *= d*d;
216 <                d += srcp->sl.s->flen;
217 <                si->dom /= d*d;
215 >                        si->dom *= d*d;
216 >                        d += srcp->sl.s->flen;
217 >                        si->dom /= d*d;
218 >                }
219 >                return(1);                      /* sample OK */
220          }
221 <        return(1);                      /* sample OK */
214 <    }
215 <    return(0);                  /* no more samples */
221 >        return(0);                      /* no more samples */
222   }
223  
224  
# Line 306 | Line 312 | sourcehit(                     /* check to see if ray hit distant source
312                   * If it's a glow or transparent illum, just remember it.
313                   */
314                  if (source[i].sflags & SSKIP) {
315 <                        glowsrc = i;
315 >                        if (glowsrc < 0)
316 >                                glowsrc = i;
317                          continue;
318                  }
319                  if (transillum(source[i].so->omod)) {
320 <                        transrc = i;
320 >                        if (transrc < 0)
321 >                                transrc = i;
322                          continue;
323                  }
324                  r->ro = source[i].so;   /* otherwise, use first hit */
# Line 409 | Line 417 | direct(                                        /* add direct component */
417                  rayvalue(&sr);
418                  multcolor(sr.rcol, sr.rcoef);
419                  copycolor(scp->val, sr.rcol);
420 <                cntord[sn].brt = intens(sr.rcol);
420 >                cntord[sn].brt = bright(sr.rcol);
421          }
422                                                  /* sort contributions */
423          qsort(cntord, sn, sizeof(CNTPTR), cntcmp);
# Line 550 | Line 558 | srcscatter(                    /* compute source scattering into ray */
558                          sr.rorg[0] = r->rorg[0] + r->rdir[0]*t;
559                          sr.rorg[1] = r->rorg[1] + r->rdir[1]*t;
560                          sr.rorg[2] = r->rorg[2] + r->rdir[2]*t;
553                        sr.rmax = 0.;
561                          initsrcindex(&si);      /* sample ray to this source */
562                          si.sn = r->slights[i];
563                          nopart(&si, &sr);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines