| 7 |  |  | 
| 8 |  | #include "bsdf.h" | 
| 9 |  |  | 
| 10 | – | #define DEBUG           1 | 
| 11 | – |  | 
| 10 |  | #ifndef GRIDRES | 
| 11 | < | #define GRIDRES         200             /* grid resolution per side */ | 
| 11 | > | #define GRIDRES         (1<<8)          /* grid resolution per side */ | 
| 12 |  | #endif | 
| 13 |  | /* convert to/from coded radians */ | 
| 14 |  | #define ANG2R(r)        (int)((r)*((1<<16)/M_PI)) | 
| 15 |  | #define R2ANG(c)        (((c)+.5)*(M_PI/(1<<16))) | 
| 16 |  |  | 
| 17 | < | typedef struct { | 
| 18 | < | float           vsum;           /* DSF sum */ | 
| 19 | < | unsigned short  nval;           /* number of values in sum */ | 
| 20 | < | unsigned short  crad;           /* radius (coded angle) */ | 
| 17 | > | typedef union { | 
| 18 | > | struct { | 
| 19 | > | float           v;              /* DSF sum */ | 
| 20 | > | unsigned int    n;              /* number of values in sum */ | 
| 21 | > | }       sum;                    /* sum for averaging */ | 
| 22 | > | float   val[2];                 /* comparison values */ | 
| 23 |  | } GRIDVAL;                      /* grid value */ | 
| 24 |  |  | 
| 25 |  | typedef struct { | 
| 57 |  | #define INP_QUAD3       4               /* 180-270 degree quadrant */ | 
| 58 |  | #define INP_QUAD4       8               /* 270-360 degree quadrant */ | 
| 59 |  |  | 
| 60 | + | /* name and manufacturer if known */ | 
| 61 | + | extern char             bsdf_name[]; | 
| 62 | + | extern char             bsdf_manuf[]; | 
| 63 |  | /* active grid resolution */ | 
| 64 |  | extern int              grid_res; | 
| 65 |  | /* coverage/symmetry using INP_QUAD? flags */ | 
| 72 |  | extern int              input_orient; | 
| 73 |  | extern int              output_orient; | 
| 74 |  |  | 
| 75 | + | /* log BSDF histogram */ | 
| 76 | + | #define HISTLEN         256 | 
| 77 | + | #define BSDF2BIG        (1./M_PI) | 
| 78 | + | #define BSDF2SML        1e-8 | 
| 79 | + | #define HISTLNR         17.2759509              /* log(BSDF2BIG/BSDF2SML) */ | 
| 80 | + | extern unsigned long    bsdf_hist[HISTLEN]; | 
| 81 | + | #define histndx(v)      (int)(log((v)*(1./BSDF2SML))*(HISTLEN/HISTLNR)) | 
| 82 | + | #define histval(i)      (exp(((i)+.5)*(HISTLNR/HISTLEN))*BSDF2SML) | 
| 83 | + |  | 
| 84 | + | /* BSDF value for boundary regions */ | 
| 85 | + | extern double           bsdf_min; | 
| 86 | + |  | 
| 87 |  | /* processed incident DSF measurements */ | 
| 88 |  | extern RBFNODE          *dsf_list; | 
| 89 |  |  | 
| 106 |  | extern char             *progname; | 
| 107 |  |  | 
| 108 |  | /* get theta value in degrees [0,180) range */ | 
| 109 | < | #define get_theta180(v) ((180./M_PI)*acos((v)[2])) | 
| 109 | > | #define get_theta180(v) ((180./M_PI)*Acos((v)[2])) | 
| 110 |  | /* get phi value in degrees, [0,360) range */ | 
| 111 |  | #define get_phi360(v)   ((180./M_PI)*atan2((v)[1],(v)[0]) + 360.*((v)[1]<0)) | 
| 112 |  |  | 
| 186 |  | /* Find edge(s) for interpolating the given vector, applying symmetry */ | 
| 187 |  | extern int              get_interp(MIGRATION *miga[3], FVECT invec); | 
| 188 |  |  | 
| 189 | + | /* Advect and allocate new RBF along edge (internal call) */ | 
| 190 | + | extern RBFNODE *        e_advect_rbf(const MIGRATION *mig, | 
| 191 | + | const FVECT invec, int lobe_lim); | 
| 192 | + |  | 
| 193 |  | /* Partially advect between recorded incident angles and allocate new RBF */ | 
| 194 | < | extern RBFNODE *        advect_rbf(const FVECT invec); | 
| 194 | > | extern RBFNODE *        advect_rbf(const FVECT invec, int lobe_lim); |