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.14 by greg, Mon Apr 22 08:20:58 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 68 | Line 72 | analyze()                      /* analyze our scene */
72                                          addsrcspan(newspan(left,h,v,spanbr));
73                                          left = hsize + 1;
74                                  }
75 <                                addindirect(h, spanbr[h+hsize]);
75 >                                addindirect(h, v, spanbr[h+hsize]);
76                          }
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  
86 < addindirect(h, br)              /* add brightness to indirect illuminances */
87 < int     h;
86 > addindirect(h, v, br)           /* add brightness to indirect illuminances */
87 > int     h, v;
88   double  br;
89   {
90          double  tanb, d;
91 +        int     hl;
92          register int    i;
93  
94 <        if (h <= -hlim) {                       /* left region */
95 <                d = (double)(h+hlim)/sampdens;
96 <                if (d <= -1.0+FTINY)
94 >        hl = hlim(v);
95 >        if (h <= -hl) {                 /* left region */
96 >                d = (double)(-h-hl)/sampdens;
97 >                if (d >= 1.0-FTINY)
98                          return;
99                  tanb = d/sqrt(1.0-d*d);
100                  for (i = 0; i < nglardirs; i++) {
101                          d = indirect[i].lcos - tanb*indirect[i].lsin;
102                          if (d > 0.0) {
103                                  indirect[i].sum += d * br;
104 <                                indirect[i].n++;
104 >                                indirect[i].n += d;
105                          }
106                  }
107                  return;
108          }
109 <        if (h >= hlim) {                        /* right region */
110 <                d = (double)(h-hlim)/sampdens;
111 <                if (d >= 1.0-FTINY)
109 >        if (h >= hl) {                  /* right region */
110 >                d = (double)(-h+hl)/sampdens;
111 >                if (d <= -1.0+FTINY)
112                          return;
113                  tanb = d/sqrt(1.0-d*d);
114                  for (i = 0; i < nglardirs; i++) {
115                          d = indirect[i].rcos - tanb*indirect[i].rsin;
116                          if (d > 0.0) {
117                                  indirect[i].sum += d * br;
118 <                                indirect[i].n++;
118 >                                indirect[i].n += d;
119                          }
120                  }
121                  return;
122          }
123                                          /* central region */
124          for (i = 0; i < nglardirs; i++) {
125 <                d = cos(h_theta(h) - indirect[i].theta);
125 >                d = cos(h_theta(h,v) - indirect[i].theta);
126                  if (d > 0.0) {
127                          indirect[i].sum += d * br;
128 <                        indirect[i].n++;
128 >                        indirect[i].n += d;
129                  }
130          }
131   }
# Line 137 | Line 142 | comp_thresh()                  /* compute glare threshold */
142                                  progname);
143          brsum = 0.0;
144          nsamps = 0;
145 <        for (v = vsize; v >= -vsize; v -= TSAMPSTEP)
145 >        for (v = vsize; v >= -vsize; v -= TSAMPSTEP) {
146                  for (h = -hsize; h <= hsize; h += TSAMPSTEP) {
147                          if ((br = getviewpix(h, v)) < 0.0)
148                                  continue;
149                          brsum += br;
150                          nsamps++;
151                  }
152 +        }
153          if (nsamps == 0) {
154                  fprintf(stderr, "%s: no viewable scene!\n", progname);
155                  exit(1);
# Line 154 | Line 160 | comp_thresh()                  /* compute glare threshold */
160                  exit(1);
161          }
162          if (verbose) {
163 + #ifdef DEBUG
164                  pict_stats();
165 + #endif
166                  fprintf(stderr,
167                          "%s: threshold set to %f cd/m2 from %d samples\n",
168                                  progname, threshold, nsamps);
# Line 167 | Line 175 | struct srcspan *nss;
175   {
176          struct source   *last, *cs, *this;
177          register struct srcspan *ss;
170        register int    res;
178  
179          cs = NULL;
180          for (this = curlist; this != NULL; this = this->next) {
# Line 178 | Line 185 | struct srcspan *nss;
185                                  if (cs == NULL)
186                                          cs = this;
187                                  else {
181                                        mergesource(cs, this);
188                                          last->next = this->next;
189 <                                        free((char *)this);
189 >                                        mergesource(cs, this);
190 >                                        this = last;
191                                  }
192                                  break;
193                          }
# Line 191 | Line 198 | struct srcspan *nss;
198                  cs = (struct source *)malloc(sizeof(struct source));
199                  if (cs == NULL)
200                          memerr("source records");
201 +                cs->dom = 0.0;
202                  cs->first = NULL;
203                  cs->next = curlist;
204                  curlist = cs;
# Line 221 | Line 229 | struct source  *sp, *ap;
229          if (prev->next == NULL)
230                  prev->next = alp;
231          sp->first = head.next;
232 <        ap->first = NULL;
232 >        if (ap->dom > 0.0 && sp->dom > 0.0) {           /* sources are done */
233 >                sp->dir[0] *= sp->dom;
234 >                sp->dir[1] *= sp->dom;
235 >                sp->dir[2] *= sp->dom;
236 >                fvsum(sp->dir, sp->dir, ap->dir, ap->dom);
237 >                normalize(sp->dir);
238 >                sp->brt = (sp->brt*sp->dom + ap->brt*ap->dom)
239 >                                / (sp->dom + ap->dom);
240 >        }
241 >        free((char *)ap);
242   }
243  
244  
# Line 246 | Line 263 | int    v;
263  
264   close_allsrcs()                 /* done with everything */
265   {
266 <        register struct source  *this, *nsrc;
266 >        register struct source  *this, *next;
267  
268 <        for (this = curlist; this != NULL; this = nsrc) {
269 <                nsrc = this->next;
268 >        this = curlist;
269 >        while (this != NULL) {
270 >                next = this->next;
271                  donesource(this);
272 +                this = next;
273          }
274          curlist = NULL;
275   }
# Line 259 | Line 278 | close_allsrcs()                        /* done with everything */
278   donesource(sp)                  /* finished with this source */
279   register struct source  *sp;
280   {
262        FVECT   dthis, dright;
281          register struct srcspan *ss;
282          int     h, n;
283 <        double  d;
283 >        double  hsum, vsum, d;
284  
285          sp->dom = 0.0;
286 <        sp->dir[0] = sp->dir[1] = sp->dir[1] = 0.0;
286 >        hsum = vsum = 0.0;
287          sp->brt = 0.0;
288          n = 0;
289          for (ss = sp->first; ss != NULL; ss = ss->next) {
290                  sp->brt += ss->brsum;
291                  n += ss->r - ss->l;
292 <                compdir(dright, ss->r, ss->v);
293 <                for (h = ss->r-1; h >= ss->l; h--) {
294 <                        compdir(dthis, h, ss->v);
295 <                        d = dist2(dthis, dright);
278 <                        fvsum(sp->dir, sp->dir, dthis, d);
292 >                for (h = ss->l; h < ss->r; h++) {
293 >                        d = pixsize(h, ss->v);
294 >                        hsum += d*h;
295 >                        vsum += d*ss->v;
296                          sp->dom += d;
280                        VCOPY(dright, dthis);
297                  }
298                  free((char *)ss);
299          }
300          sp->first = NULL;
301          sp->brt /= (double)n;
302 <        sp->dir[0] /= sp->dom;
287 <        sp->dir[1] /= sp->dom;
288 <        sp->dir[2] /= sp->dom;
302 >        compdir(sp->dir, (int)(hsum/sp->dom), (int)(vsum/sp->dom));
303          sp->next = donelist;
304          donelist = sp;
305          if (verbose)
306                  fprintf(stderr,
307 <        "%s: found source at (%f,%f,%f), dw %f, br %f\n",
307 >        "%s: source at [%.3f,%.3f,%.3f], dw %.5f, br %.1f (%d samps)\n",
308                          progname, sp->dir[0], sp->dir[1], sp->dir[2],
309 <                        sp->dom, sp->brt);
309 >                        sp->dom, sp->brt, n);
310 > }
311 >
312 >
313 > struct source *
314 > findbuddy(s, l)                 /* find close enough source to s in l*/
315 > register struct source  *s, *l;
316 > {
317 >        struct source   *bestbuddy = NULL;
318 >        double  d, r, mindist = MAXBUDDY;
319 >
320 >        r = sqrt(s->dom/PI);
321 >        for ( ; l != NULL; l = l->next) {
322 >                d = sqrt(dist2(l->dir, s->dir)) - sqrt(l->dom/PI) - r;
323 >                if (d < mindist) {
324 >                        bestbuddy = l;
325 >                        mindist = d;
326 >                }
327 >        }
328 >        return(bestbuddy);
329 > }
330 >
331 >
332 > absorb_specks()                 /* eliminate too-small sources */
333 > {
334 >        struct source   head, *buddy;
335 >        register struct source  *last, *this;
336 >
337 >        if (verbose)
338 >                fprintf(stderr, "%s: absorbing small sources...\n", progname);
339 >        head.next = donelist;
340 >        last = &head;
341 >        for (this = head.next; this != NULL; this = this->next)
342 >                if (TOOSMALL(this)) {
343 >                        last->next = this->next;
344 >                        buddy = findbuddy(this, head.next);
345 >                        if (buddy != NULL)
346 >                                mergesource(buddy, this);
347 >                        else
348 >                                absorb(this);
349 >                        this = last;
350 >                } else
351 >                        last = this;
352 >        donelist = head.next;
353 > }
354 >
355 >
356 > absorb(s)                       /* absorb a source into indirect */
357 > register struct source  *s;
358 > {
359 >        FVECT   dir;
360 >        double  d;
361 >        register int    i;
362 >
363 >        for (i = 0; i < nglardirs; i++) {
364 >                spinvector(dir, ourview.vdir, ourview.vup, indirect[i].theta);
365 >                d = DOT(dir,s->dir)*s->dom*(sampdens*sampdens);
366 >                if (d <= 0.0)
367 >                        continue;
368 >                indirect[i].sum += d * s->brt;
369 >                indirect[i].n += d;
370 >        }
371 >        for ( ; s->first != NULL; s->first = s->first->next)
372 >                free((char *)s->first);
373 >        free((char *)s);
374   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines