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

Comparing ray/src/cv/bsdfpeaks.c (file contents):
Revision 2.1 by greg, Wed May 21 17:23:07 2025 UTC vs.
Revision 2.5 by greg, Tue Jun 3 21:31:51 2025 UTC

# Line 10 | Line 10 | static const char RCSid[] = "$Id$";
10   #include <stdio.h>
11   #include <stdlib.h>
12   #include <math.h>
13 + #include "paths.h"
14   #include "bsdfrep.h"
15  
16   typedef struct {
17 <        float   peakv;          /* peak BSDF value */
18 <        float   width;          /* smallest FWHM (deg) */
19 <        RBFNODE *rbs;           /* incident system */
20 <        int     ndx;            /* peak index for RBFVAL */
17 >        float           peakv;          /* peak BSDF value */
18 >        float           width;          /* smallest FWHM (deg) */
19 >        const RBFNODE   *rbs;           /* incident system */
20 >        int             ndx;            /* peak index for RBFVAL */
21   } FWHM;                 /* struct to hold peak value */
22  
23 < typedef double  eval_f(const FVECT vin, const FVECT vout, void *p);
23 > typedef double  eval_f(const FVECT vin, const FVECT vout, const void *p);
24  
24 char    *progname;              /* needed by bsdfrep.c */
25
25   /* Comparison function to put larger peaks first */
26   int
27   cmpFWHM(const void *p0, const void *p1)
# Line 37 | Line 36 | cmpFWHM(const void *p0, const void *p1)
36  
37   /* BSDF evaluation function for RBF system */
38   double
39 < rbf_eval(const FVECT vin, const FVECT vout, void *p)
39 > rbf_eval(const FVECT vin, const FVECT vout, const void *p)
40   {
41          /* XXX verify vin == p->invec ? */
42 <        return(eval_rbfrep((RBFNODE *)p, vout));
42 >        return(eval_rbfrep((const RBFNODE *)p, vout));
43   }
44  
45   /* BSDF evaluation for XML input */
46   double
47 < bsdf_eval(const FVECT vin, const FVECT vout, void *p)
47 > bsdf_eval(const FVECT vin, const FVECT vout, const void *p)
48   {
49          SDValue sv;
50  
51          if (SDreportError(
52 <                        SDevalBSDF(&sv, vin, vout, (SDData *)p),
52 >                        SDevalBSDF(&sv, vin, vout, (const SDData *)p),
53                          stderr))
54                  exit(1);
55  
# Line 59 | Line 58 | bsdf_eval(const FVECT vin, const FVECT vout, void *p)
58  
59   /* Find full-width, half-maximum in radians around BSDF direction */
60   double
61 < getFWHM(const FVECT vin, const FVECT vc, double rad0, eval_f *ev, void *p)
61 > getFWHM(const FVECT vin, const FVECT vc, double rad0, eval_f *ev, const void *p)
62   {
63          const double    peakv = (*ev)(vin, vc, p);
64          double          rad1 = rad0;                    /* current radii */
# Line 73 | Line 72 | getFWHM(const FVECT vin, const FVECT vc, double rad0,
72                  spinvector(vt, v0, vc, phi);
73                  if ((*ev)(vin, vt, p) <= .5*peakv) {    /* found one side? */
74                      FVECT       vt1;
75 <                    while (rad1 < M_PI/2.) {            /* find opposite */
75 >                    while (rad1 < M_PI/2.) {            /* bracket peak */
76                          geodesic(vt1, vt, vc, rad0+rad1, GEOD_RAD);
77                          if ((*ev)(vin, vt1, p) <= .5*peakv)
78                              return(rad0+rad1);          /* got both! */
# Line 90 | Line 89 | getFWHM(const FVECT vin, const FVECT vc, double rad0,
89   void
90   getOutDir(FVECT vo, FWHM *dp)
91   {
92 <        RBFVAL  *vp = dp->rbs->rbfa + dp->ndx;
92 >        const RBFVAL    *vp = dp->rbs->rbfa + dp->ndx;
93  
94          ovec_from_pos(vo, vp->gx, vp->gy);
95   }
96  
97   /* Assign FWHM record for specified RBF system */
98   void
99 < assignFWHM(FWHM *dp, RBFNODE *rbf)
99 > assignFWHM(FWHM *dp, const RBFNODE *rbf)
100   {
101          FVECT   vo;
102          int     j;
# Line 121 | Line 120 | assignFWHM(FWHM *dp, RBFNODE *rbf)
120   int
121   main(int argc, char *argv[])
122   {
123 <        RBFNODE *rbf;
124 <        SDData  *sdp;
125 <        FILE    *fp;
126 <        int     ndirs;
127 <        FWHM    *peaka;
128 <        int     i;
129 <
130 <        progname = argv[0];
123 >        const RBFNODE   *rbf;
124 >        SDData          *sdp;
125 >        FILE            *fp;
126 >        int             ndirs;
127 >        FWHM            *peaka;
128 >        int             i;
129 >                                                /* set global progname */
130 >        fixargv0(argv[0]);
131          if (argc < 2)
132                  goto userr;
133  
# Line 193 | Line 192 | main(int argc, char *argv[])
192  
193                          printf("\t%.1f", 180./M_PI * getFWHM(peaka[i].rbs->invec,
194                                                  vout, sqrt(psa/M_PI),
195 <                                                bsdf_eval, (void *)sd));
195 >                                                bsdf_eval, sd));
196 >                        SDfreeCache(sd);
197                  }
198                  fputc('\n', stdout);
199          }
200 +        /*                      we're exiting, anyway...
201 +        SDfreeCache(NULL);
202 +        clear_bsdf_rep();
203 +        */
204          return(0);
205   userr:
206          fprintf(stderr, "Usage: %s bsdf.sir [bsdfrep1.xml ..]\n", progname);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines