/* Add BSDF data point */ void add_bsdf_data(double theta_out, double phi_out, double val, int isDSF) { FVECT ovec; int pos[2]; if (!output_orient) /* check output orientation */ output_orient = 1 - 2*(theta_out > 90.); else if (output_orient > 0 ^ theta_out < 90.) { fputs("Cannot handle output angles on both sides of surface\n", stderr); exit(1); } ovec[2] = sin((M_PI/180.)*theta_out); ovec[0] = cos((M_PI/180.)*phi_out) * ovec[2]; ovec[1] = sin((M_PI/180.)*phi_out) * ovec[2]; ovec[2] = sqrt(1. - ovec[2]*ovec[2]); if (!isDSF) val *= ovec[2]; /* convert from BSDF to DSF */ /* update BSDF histogram */ if (val < BSDF2BIG*ovec[2] && val > BSDF2SML*ovec[2]) ++bsdf_hist[histndx(val/ovec[2])]; pos_from_vec(pos, ovec); dsf_grid[pos[0]][pos[1]].vsum += val; dsf_grid[pos[0]][pos[1]].nval++; }
/* Rotate RBF to correspond to given incident vector */ void rotate_rbf(RBFNODE *rbf, const FVECT invec) { static const FVECT vnorm = {.0, .0, 1.}; const double phi = atan2(invec[1],invec[0]) - atan2(rbf->invec[1],rbf->invec[0]); FVECT outvec; int pos[2]; int n; for (n = ((-.01 > phi) | (phi > .01))*rbf->nrbf; n-- > 0; ) { ovec_from_pos(outvec, rbf->rbfa[n].gx, rbf->rbfa[n].gy); spinvector(outvec, outvec, vnorm, phi); pos_from_vec(pos, outvec); rbf->rbfa[n].gx = pos[0]; rbf->rbfa[n].gy = pos[1]; } VCOPY(rbf->invec, invec); }