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.4 by greg, Tue Mar 19 09:10:58 1991 UTC vs.
Revision 1.11 by greg, Wed Apr 10 15:59:10 1991 UTC

# Line 16 | Line 16 | static char SCCSid[] = "$SunId$ LBL";
16   struct source   *curlist = NULL;        /* current source list */
17   struct source   *donelist = NULL;       /* finished sources */
18  
19 double  threshold;                      /* glare threshold */
19  
21
20   struct srcspan *
21   newspan(l, r, v, sb)            /* allocate a new source span */
22   int     l, r, v;
# Line 50 | Line 48 | analyze()                      /* analyze our scene */
48          if (spanbr == NULL)
49                  memerr("view span brightness buffer");
50          for (v = vsize; v >= -vsize; v--) {
51 +                close_sources(v);
52 + #ifndef DEBUG
53 +                if (verbose)
54 +                        fprintf(stderr, "%s: analyzing... %3ld%%\r",
55 +                                progname, 100L*(vsize-v)/(2*vsize));
56 + #endif
57                  getviewspan(v, spanbr);
58                  left = hsize + 1;
59                  for (h = -hsize; h <= hsize; h++) {
# Line 73 | Line 77 | analyze()                      /* analyze our scene */
77                  }
78                  if (left < h)
79                          addsrcspan(newspan(left,h,v,spanbr));
76                close_sources(v);
80          }
78        close_allsrcs();
81          free((char *)spanbr);
82 +        close_allsrcs();
83   }
84  
85  
# Line 88 | Line 91 | double br;
91          register int    i;
92  
93          if (h <= -hlim) {                       /* left region */
94 <                d = (double)(h+hlim)/sampdens;
95 <                if (d <= -1.0+FTINY)
94 >                d = (double)(-h-hlim)/sampdens;
95 >                if (d >= 1.0-FTINY)
96                          return;
97                  tanb = d/sqrt(1.0-d*d);
98                  for (i = 0; i < nglardirs; i++) {
99                          d = indirect[i].lcos - tanb*indirect[i].lsin;
100                          if (d > 0.0) {
101                                  indirect[i].sum += d * br;
102 <                                indirect[i].n++;
102 >                                indirect[i].n += d;
103                          }
104                  }
105                  return;
106          }
107          if (h >= hlim) {                        /* right region */
108 <                d = (double)(h-hlim)/sampdens;
109 <                if (d >= 1.0-FTINY)
108 >                d = (double)(-h+hlim)/sampdens;
109 >                if (d <= -1.0+FTINY)
110                          return;
111                  tanb = d/sqrt(1.0-d*d);
112                  for (i = 0; i < nglardirs; i++) {
113                          d = indirect[i].rcos - tanb*indirect[i].rsin;
114                          if (d > 0.0) {
115                                  indirect[i].sum += d * br;
116 <                                indirect[i].n++;
116 >                                indirect[i].n += d;
117                          }
118                  }
119                  return;
# Line 120 | Line 123 | double br;
123                  d = cos(h_theta(h) - indirect[i].theta);
124                  if (d > 0.0) {
125                          indirect[i].sum += d * br;
126 <                        indirect[i].n++;
126 >                        indirect[i].n += d;
127                  }
128          }
129   }
# Line 154 | Line 157 | comp_thresh()                  /* compute glare threshold */
157                  exit(1);
158          }
159          if (verbose) {
160 + #ifdef DEBUG
161                  pict_stats();
162 + #endif
163                  fprintf(stderr,
164                          "%s: threshold set to %f cd/m2 from %d samples\n",
165                                  progname, threshold, nsamps);
# Line 167 | Line 172 | struct srcspan *nss;
172   {
173          struct source   *last, *cs, *this;
174          register struct srcspan *ss;
170        register int    res;
175  
176          cs = NULL;
177          for (this = curlist; this != NULL; this = this->next) {
# Line 178 | Line 182 | struct srcspan *nss;
182                                  if (cs == NULL)
183                                          cs = this;
184                                  else {
181                                        mergesource(cs, this);
185                                          last->next = this->next;
186 <                                        free((char *)this);
186 >                                        mergesource(cs, this);
187 >                                        this = last;
188                                  }
189                                  break;
190                          }
# Line 191 | Line 195 | struct srcspan *nss;
195                  cs = (struct source *)malloc(sizeof(struct source));
196                  if (cs == NULL)
197                          memerr("source records");
198 +                cs->dom = 0.0;
199                  cs->first = NULL;
200                  cs->next = curlist;
201                  curlist = cs;
# Line 221 | Line 226 | struct source  *sp, *ap;
226          if (prev->next == NULL)
227                  prev->next = alp;
228          sp->first = head.next;
229 <        ap->first = NULL;
229 >        if (ap->dom > 0.0 && sp->dom > 0.0) {           /* sources are done */
230 >                sp->dir[0] *= sp->dom;
231 >                sp->dir[1] *= sp->dom;
232 >                sp->dir[2] *= sp->dom;
233 >                fvsum(sp->dir, sp->dir, ap->dir, ap->dom);
234 >                normalize(sp->dir);
235 >                sp->brt = (sp->brt*sp->dom + ap->brt*ap->dom)
236 >                                / (sp->dom + ap->dom);
237 >        }
238 >        free((char *)ap);
239   }
240  
241  
# Line 246 | Line 260 | int    v;
260  
261   close_allsrcs()                 /* done with everything */
262   {
263 <        register struct source  *this, *nsrc;
263 >        register struct source  *this, *next;
264  
265 <        for (this = curlist; this != NULL; this = nsrc) {
266 <                nsrc = this->next;
265 >        this = curlist;
266 >        while (this != NULL) {
267 >                next = this->next;
268                  donesource(this);
269 +                this = next;
270          }
271          curlist = NULL;
272   }
# Line 265 | Line 281 | register struct source *sp;
281          double  d;
282  
283          sp->dom = 0.0;
284 <        sp->dir[0] = sp->dir[1] = sp->dir[1] = 0.0;
284 >        sp->dir[0] = sp->dir[1] = sp->dir[2] = 0.0;
285          sp->brt = 0.0;
286          n = 0;
287          for (ss = sp->first; ss != NULL; ss = ss->next) {
288                  sp->brt += ss->brsum;
289                  n += ss->r - ss->l;
290 <                compdir(dright, ss->r, ss->v);
291 <                for (h = ss->r-1; h >= ss->l; h--) {
292 <                        compdir(dthis, h, ss->v);
293 <                        d = dist2(dthis, dright);
294 <                        fvsum(sp->dir, sp->dir, dthis, d);
295 <                        sp->dom += d;
296 <                        VCOPY(dright, dthis);
297 <                }
290 >                if (compdir(dright, ss->r, ss->v) < 0)
291 >                        compdir(dright, ss->r-2, ss->v);
292 >                for (h = ss->r-1; h >= ss->l; h--)
293 >                        if (compdir(dthis, h, ss->v) == 0) {
294 >                                d = dist2(dthis, dright);
295 >                                fvsum(sp->dir, sp->dir, dthis, d);
296 >                                sp->dom += d;
297 >                                VCOPY(dright, dthis);
298 >                        }
299                  free((char *)ss);
300          }
301          sp->first = NULL;
302          sp->brt /= (double)n;
303 <        sp->dir[0] /= sp->dom;
287 <        sp->dir[1] /= sp->dom;
288 <        sp->dir[2] /= sp->dom;
303 >        normalize(sp->dir);
304          sp->next = donelist;
305          donelist = sp;
306          if (verbose)
307                  fprintf(stderr,
308 <        "%s: found source at (%f,%f,%f), dw %f, br %f\n",
308 >        "%s: found source at (%.3f,%.3f,%.3f), dw %.5f, br %.1f (%d samps)\n",
309                          progname, sp->dir[0], sp->dir[1], sp->dir[2],
310 <                        sp->dom, sp->brt);
310 >                        sp->dom, sp->brt, n);
311 > }
312 >
313 >
314 > struct source *
315 > findbuddy(s, l)                 /* find close enough source to s in l*/
316 > register struct source  *s, *l;
317 > {
318 >        struct source   *bestbuddy = NULL;
319 >        double  d, r, mindist = MAXBUDDY;
320 >
321 >        r = sqrt(s->dom/PI);
322 >        for ( ; l != NULL; l = l->next) {
323 >                d = sqrt(dist2(l->dir, s->dir)) - sqrt(l->dom/PI) - r;
324 >                if (d < mindist) {
325 >                        bestbuddy = l;
326 >                        mindist = d;
327 >                }
328 >        }
329 >        return(bestbuddy);
330 > }
331 >
332 >
333 > absorb_specks()                 /* eliminate too-small sources */
334 > {
335 >        struct source   head, *buddy;
336 >        register struct source  *last, *this;
337 >
338 >        if (verbose)
339 >                fprintf(stderr, "%s: absorbing small sources...\n", progname);
340 >        head.next = donelist;
341 >        last = &head;
342 >        for (this = head.next; this != NULL; this = this->next)
343 >                if (TOOSMALL(this)) {
344 >                        last->next = this->next;
345 >                        buddy = findbuddy(this, head.next);
346 >                        if (buddy != NULL)
347 >                                mergesource(buddy, this);
348 >                        else
349 >                                absorb(this);
350 >                        this = last;
351 >                } else
352 >                        last = this;
353 >        donelist = head.next;
354 > }
355 >
356 >
357 > absorb(s)                       /* absorb a source into indirect */
358 > register struct source  *s;
359 > {
360 >        FVECT   dir;
361 >        double  d;
362 >        register int    i;
363 >
364 >        for (i = 0; i < nglardirs; i++) {
365 >                spinvector(dir, ourview.vdir, ourview.vup, indirect[i].theta);
366 >                d = DOT(dir,s->dir)*s->dom*(sampdens*sampdens);
367 >                if (d <= 0.0)
368 >                        continue;
369 >                indirect[i].sum += d * s->brt;
370 >                indirect[i].n += d;
371 >        }
372 >        for ( ; s->first != NULL; s->first = s->first->next)
373 >                free((char *)s->first);
374 >        free((char *)s);
375   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines