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

Comparing ray/src/util/glaresrc.c (file contents):
Revision 1.6 by greg, Tue Mar 19 17:21:31 1991 UTC vs.
Revision 1.7 by greg, Wed Mar 20 12:18:14 1991 UTC

# Line 73 | Line 73 | analyze()                      /* analyze our scene */
73                  if (left < h)
74                          addsrcspan(newspan(left,h,v,spanbr));
75          }
76        close_allsrcs();
76          free((char *)spanbr);
77 +        close_allsrcs();
78 +        absorb_specks();
79   }
80  
81  
# Line 175 | Line 176 | struct srcspan *nss;
176                                  if (cs == NULL)
177                                          cs = this;
178                                  else {
178                                        mergesource(cs, this);
179                                          last->next = this->next;
180 <                                        free((char *)this);
180 >                                        mergesource(cs, this);
181                                          this = last;
182                                  }
183                                  break;
# Line 189 | Line 189 | struct srcspan *nss;
189                  cs = (struct source *)malloc(sizeof(struct source));
190                  if (cs == NULL)
191                          memerr("source records");
192 +                cs->dom = 0.0;
193                  cs->first = NULL;
194                  cs->next = curlist;
195                  curlist = cs;
# Line 219 | Line 220 | struct source  *sp, *ap;
220          if (prev->next == NULL)
221                  prev->next = alp;
222          sp->first = head.next;
223 <        ap->first = NULL;
223 >        if (ap->dom > 0.0 && sp->dom > 0.0) {           /* sources are done */
224 >                sp->dir[0] *= sp->dom;
225 >                sp->dir[1] *= sp->dom;
226 >                sp->dir[2] *= sp->dom;
227 >                fvsum(sp->dir, sp->dir, ap->dir, ap->dom);
228 >                normalize(sp->dir);
229 >                sp->brt = (sp->brt*sp->dom + ap->brt*ap->dom)
230 >                                / (sp->dom + ap->dom);
231 >        }
232 >        free((char *)ap);
233   }
234  
235  
# Line 292 | Line 302 | register struct source *sp;
302          "%s: found source at (%.3f,%.3f,%.3f), dw %.5f, br %.1f (%d samps)\n",
303                          progname, sp->dir[0], sp->dir[1], sp->dir[2],
304                          sp->dom, sp->brt, n);
305 + }
306 +
307 +
308 + struct source *
309 + findbuddy(s, l)                 /* find close enough source to s in l*/
310 + register struct source  *s, *l;
311 + {
312 +        struct source   *bestbuddy = NULL;
313 +        double  d, r, mindist = MAXBUDDY;
314 +
315 +        r = sqrt(s->dom/PI);
316 +        for ( ; l != NULL; l = l->next) {
317 +                d = sqrt(dist2(l->dir, s->dir)) - sqrt(l->dom/PI) - r;
318 +                if (d < mindist) {
319 +                        bestbuddy = l;
320 +                        mindist = d;
321 +                }
322 +        }
323 +        return(bestbuddy);
324 + }
325 +
326 +
327 + absorb_specks()                 /* eliminate too-small sources */
328 + {
329 +        struct source   head, *buddy;
330 +        register struct source  *last, *this;
331 +
332 +        if (verbose)
333 +                fprintf(stderr, "%s: absorbing small sources...\n", progname);
334 +        head.next = donelist;
335 +        last = &head;
336 +        for (this = donelist; this != NULL; this = this->next)
337 +                if (TOOSMALL(this)) {
338 +                        last->next = this->next;
339 +                        buddy = findbuddy(this, donelist);
340 +                        if (buddy != NULL)
341 +                                mergesource(buddy, this);
342 +                        else
343 +                                absorb(this);
344 +                        this = last;
345 +                } else
346 +                        last = this;
347 +        donelist = head.next;
348 + }
349 +
350 +
351 + absorb(s)                       /* absorb a source into indirect */
352 + register struct source  *s;
353 + {
354 +        FVECT   dir;
355 +        register int    i, n;
356 +
357 +        for (i = 0; i < nglardirs; i++) {
358 +                spinvector(dir, ourview.vdir, ourview.vup, indirect[i].theta);
359 +                n = DOT(dir,s->dir)*s->dom*(sampdens*sampdens) + 0.5;
360 +                if (n == 0)
361 +                        continue;
362 +                indirect[i].sum += n * s->brt;
363 +                indirect[i].n += n;
364 +        }
365 +        for ( ; s->first != NULL; s->first = s->first->next)
366 +                free((char *)s->first);
367 +        free((char *)s);
368   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines