--- ray/src/cv/bsdfpeaks.c 2025/05/21 17:23:07 2.1 +++ ray/src/cv/bsdfpeaks.c 2025/06/03 21:31:51 2.5 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: bsdfpeaks.c,v 2.1 2025/05/21 17:23:07 greg Exp $"; +static const char RCSid[] = "$Id: bsdfpeaks.c,v 2.5 2025/06/03 21:31:51 greg Exp $"; #endif /* * Compute minimum FWHM peak for each incident direction in SIR input. @@ -10,19 +10,18 @@ static const char RCSid[] = "$Id: bsdfpeaks.c,v 2.1 20 #include #include #include +#include "paths.h" #include "bsdfrep.h" typedef struct { - float peakv; /* peak BSDF value */ - float width; /* smallest FWHM (deg) */ - RBFNODE *rbs; /* incident system */ - int ndx; /* peak index for RBFVAL */ + float peakv; /* peak BSDF value */ + float width; /* smallest FWHM (deg) */ + const RBFNODE *rbs; /* incident system */ + int ndx; /* peak index for RBFVAL */ } FWHM; /* struct to hold peak value */ -typedef double eval_f(const FVECT vin, const FVECT vout, void *p); +typedef double eval_f(const FVECT vin, const FVECT vout, const void *p); -char *progname; /* needed by bsdfrep.c */ - /* Comparison function to put larger peaks first */ int cmpFWHM(const void *p0, const void *p1) @@ -37,20 +36,20 @@ cmpFWHM(const void *p0, const void *p1) /* BSDF evaluation function for RBF system */ double -rbf_eval(const FVECT vin, const FVECT vout, void *p) +rbf_eval(const FVECT vin, const FVECT vout, const void *p) { /* XXX verify vin == p->invec ? */ - return(eval_rbfrep((RBFNODE *)p, vout)); + return(eval_rbfrep((const RBFNODE *)p, vout)); } /* BSDF evaluation for XML input */ double -bsdf_eval(const FVECT vin, const FVECT vout, void *p) +bsdf_eval(const FVECT vin, const FVECT vout, const void *p) { SDValue sv; if (SDreportError( - SDevalBSDF(&sv, vin, vout, (SDData *)p), + SDevalBSDF(&sv, vin, vout, (const SDData *)p), stderr)) exit(1); @@ -59,7 +58,7 @@ bsdf_eval(const FVECT vin, const FVECT vout, void *p) /* Find full-width, half-maximum in radians around BSDF direction */ double -getFWHM(const FVECT vin, const FVECT vc, double rad0, eval_f *ev, void *p) +getFWHM(const FVECT vin, const FVECT vc, double rad0, eval_f *ev, const void *p) { const double peakv = (*ev)(vin, vc, p); double rad1 = rad0; /* current radii */ @@ -73,7 +72,7 @@ getFWHM(const FVECT vin, const FVECT vc, double rad0, spinvector(vt, v0, vc, phi); if ((*ev)(vin, vt, p) <= .5*peakv) { /* found one side? */ FVECT vt1; - while (rad1 < M_PI/2.) { /* find opposite */ + while (rad1 < M_PI/2.) { /* bracket peak */ geodesic(vt1, vt, vc, rad0+rad1, GEOD_RAD); if ((*ev)(vin, vt1, p) <= .5*peakv) return(rad0+rad1); /* got both! */ @@ -90,14 +89,14 @@ getFWHM(const FVECT vin, const FVECT vc, double rad0, void getOutDir(FVECT vo, FWHM *dp) { - RBFVAL *vp = dp->rbs->rbfa + dp->ndx; + const RBFVAL *vp = dp->rbs->rbfa + dp->ndx; ovec_from_pos(vo, vp->gx, vp->gy); } /* Assign FWHM record for specified RBF system */ void -assignFWHM(FWHM *dp, RBFNODE *rbf) +assignFWHM(FWHM *dp, const RBFNODE *rbf) { FVECT vo; int j; @@ -121,14 +120,14 @@ assignFWHM(FWHM *dp, RBFNODE *rbf) int main(int argc, char *argv[]) { - RBFNODE *rbf; - SDData *sdp; - FILE *fp; - int ndirs; - FWHM *peaka; - int i; - - progname = argv[0]; + const RBFNODE *rbf; + SDData *sdp; + FILE *fp; + int ndirs; + FWHM *peaka; + int i; + /* set global progname */ + fixargv0(argv[0]); if (argc < 2) goto userr; @@ -193,10 +192,15 @@ main(int argc, char *argv[]) printf("\t%.1f", 180./M_PI * getFWHM(peaka[i].rbs->invec, vout, sqrt(psa/M_PI), - bsdf_eval, (void *)sd)); + bsdf_eval, sd)); + SDfreeCache(sd); } fputc('\n', stdout); } + /* we're exiting, anyway... + SDfreeCache(NULL); + clear_bsdf_rep(); + */ return(0); userr: fprintf(stderr, "Usage: %s bsdf.sir [bsdfrep1.xml ..]\n", progname);