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

Comparing ray/src/cv/bsdfrbf.c (file contents):
Revision 2.1 by greg, Fri Oct 19 04:14:29 2012 UTC vs.
Revision 2.4 by greg, Wed Mar 20 01:00:22 2013 UTC

# Line 51 | Line 51 | add_bsdf_data(double theta_out, double phi_out, double
51          if (!isDSF)
52                  val *= ovec[2];         /* convert from BSDF to DSF */
53  
54 +                                        /* update BSDF histogram */
55 +        if (val < BSDF2BIG*ovec[2] && val > BSDF2SML*ovec[2])
56 +                ++bsdf_hist[histndx(val/ovec[2])];
57 +
58          pos_from_vec(pos, ovec);
59  
60          dsf_grid[pos[0]][pos[1]].vsum += val;
# Line 193 | Line 197 | make_rbfrep(void)
197          double  lastVar, thisVar = 100.;
198          int     nn;
199          RBFNODE *newnode;
200 +        RBFVAL  *itera;
201          int     i, j;
202                                  /* compute RBF radii */
203          compute_radii();
# Line 204 | Line 209 | make_rbfrep(void)
209                  nn += dsf_grid[i][j].nval;
210                                  /* allocate RBF array */
211          newnode = (RBFNODE *)malloc(sizeof(RBFNODE) + sizeof(RBFVAL)*(nn-1));
212 <        if (newnode == NULL) {
213 <                fprintf(stderr, "%s: Out of memory in make_rbfrep()\n", progname);
209 <                exit(1);
210 <        }
212 >        if (newnode == NULL)
213 >                goto memerr;
214          newnode->ord = -1;
215          newnode->next = NULL;
216          newnode->ejl = NULL;
# Line 228 | Line 231 | make_rbfrep(void)
231                          ++nn;
232                  }
233                                  /* iterate to improve interpolation accuracy */
234 +        itera = (RBFVAL *)malloc(sizeof(RBFVAL)*newnode->nrbf);
235 +        if (itera == NULL)
236 +                goto memerr;
237 +        memcpy(itera, newnode->rbfa, sizeof(RBFVAL)*newnode->nrbf);
238          do {
239                  double  dsum = 0, dsum2 = 0;
240                  nn = 0;
# Line 237 | Line 244 | make_rbfrep(void)
244                                  FVECT   odir;
245                                  double  corr;
246                                  ovec_from_pos(odir, i, j);
247 <                                newnode->rbfa[nn++].peak *= corr =
247 >                                itera[nn++].peak *= corr =
248                                          dsf_grid[i][j].vsum /
249                                                  eval_rbfrep(newnode, odir);
250 <                                dsum += corr - 1.;
251 <                                dsum2 += (corr-1.)*(corr-1.);
250 >                                dsum += 1. - corr;
251 >                                dsum2 += (1.-corr)*(1.-corr);
252                          }
253 +                memcpy(newnode->rbfa, itera, sizeof(RBFVAL)*newnode->nrbf);
254                  lastVar = thisVar;
255                  thisVar = dsum2/(double)nn;
256   #ifdef DEBUG
# Line 252 | Line 260 | make_rbfrep(void)
260   #endif
261          } while (--niter > 0 && lastVar-thisVar > 0.02*lastVar);
262  
263 +        free(itera);
264          nn = 0;                 /* compute sum for normalization */
265          while (nn < newnode->nrbf)
266                  newnode->vtotal += rbf_volume(&newnode->rbfa[nn++]);
267 <
267 > #ifdef DEBUG
268 >        fprintf(stderr, "Integrated DSF at (%.1f,%.1f) deg. is %.2f\n",
269 >                        get_theta180(newnode->invec), get_phi360(newnode->invec),
270 >                        newnode->vtotal);
271 > #endif
272          insert_dsf(newnode);
273  
274          return(newnode);
275 + memerr:
276 +        fprintf(stderr, "%s: Out of memory in make_rbfrep()\n", progname);
277 +        exit(1);
278   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines