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

Comparing ray/src/util/rttree_reduce.c (file contents):
Revision 2.7 by greg, Sun Mar 25 15:23:55 2012 UTC vs.
Revision 2.10 by greg, Tue Mar 18 01:33:07 2014 UTC

# Line 110 | Line 110 | build_tree(TNODE *tp, const int bmin[], int l2s)
110  
111   /* Set our trimming threshold */
112   static void
113 < set_threshold()
113 > set_threshold(void)
114   {
115          int     hsum = 0;
116          int     i;
# Line 235 | Line 235 | read_double(float *rowp, int n)
235          return(nread);
236   }
237  
238 + /* Truncate any negative values to zero */
239 + static void
240 + noneg(float *varr, int n)
241 + {
242 +        int     nnan = 0;
243 +
244 +        while (n-- > 0) {
245 + #ifdef isnan
246 +                if (isnan(*varr)) {
247 +                        *varr = 0;
248 +                        ++nnan;
249 +                } else
250 + #endif
251 +                if (*varr < 0) *varr = 0;
252 +                ++varr;
253 +        }
254 +        if (nnan)
255 +                fprintf(stderr, "Warning: BSDF data contains %d NaN values\n",
256 +                                nnan);
257 + }
258 +
259   /* Load data array, filling zeroes for rank 3 demi-tensor */
260   static void
261 < load_data()
261 > load_data(void)
262   {
263          int     (*readf)(float *, int) = NULL;
264          
# Line 289 | Line 310 | load_data()
310                  }
311          } else if (getc(stdin) != EOF)
312                  error(WARNING, "binary data past end of expected input");
313 +
314 +        noneg(datarr, 1<<(log2g*ttrank));       /* take precautions */
315   }
316  
317   /* Enforce reciprocity by averaging data values */
318   static void
319 < do_reciprocity()
319 > do_reciprocity(void)
320   {
321 <        float   *v1p, *v2p;
321 >        const int       siz = 1<<log2g;
322 >        float           *v1p, *v2p;
323  
324          if (ttrank == 3) {
325                  int     ix, ox, oy;
326 <                for (ix = 0; ix < 1<<(log2g-1); ix++)
327 <                    for (ox = 0; ox < 1<<log2g; ox++)
328 <                        for (oy = 0; oy < 1<<(log2g-1); oy++) {
326 >                for (ix = 0; ix < siz>>1; ix++)
327 >                    for (ox = 0; ox < siz; ox++)
328 >                        for (oy = 0; oy < siz>>1; oy++) {
329                                  v1p = &dval3(ix,ox,oy);
330 <                                v2p = &dval3(ix,ox,(1<<log2g)-1-oy);
330 >                                v2p = &dval3(ix,ox,siz-1-oy);
331                                  *v1p = *v2p = .5f*( *v1p + *v2p );
332                          }
333          } else /* ttrank == 4 */ {
334                  int     ix, iy, ox, oy;
335 <                for (ix = 1; ix < 1<<log2g; ix++)
336 <                    for (iy = 1; iy < 1<<log2g; iy++)
335 >                for (ix = 1; ix < siz; ix++)
336 >                    for (iy = 1; iy < siz; iy++)
337                          for (ox = 0; ox < ix; ox++)
338                              for (oy = 0; oy < iy; oy++) {
339 <                                v1p = &dval4(ix,iy,ox,oy);
340 <                                v2p = &dval4(ox,oy,ix,iy);
339 >                                v1p = &dval4(siz-1-ix,siz-1-iy,ox,oy);
340 >                                v2p = &dval4(siz-1-ox,siz-1-oy,ix,iy);
341                                  *v1p = *v2p = .5f*( *v1p + *v2p );
342                              }
343          }
# Line 363 | Line 387 | main(int argc, char *argv[])
387          if (i < argc-1)
388                  goto userr;
389                                          /* load input data */
390 <        if (i == argc-1 && freopen(argv[i], "rb", stdin) == NULL) {
390 >        if (i == argc-1 && freopen(argv[i], "r", stdin) == NULL) {
391                  sprintf(errmsg, "cannot open input file '%s'", argv[i]);
392                  error(SYSTEM, errmsg);
393          }
394          if (infmt != 'a')
395                  SET_FILE_BINARY(stdin);
396 + #ifdef getc_unlocked                    /* avoid lock/unlock overhead */
397 +        flockfile(stdin);
398 + #endif
399          load_data();
400          if (recipavg)
401                  do_reciprocity();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines