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

Comparing ray/src/rt/func.c (file contents):
Revision 2.27 by greg, Wed Jun 27 16:29:26 2012 UTC vs.
Revision 2.34 by greg, Sat May 13 00:26:27 2017 UTC

# Line 11 | Line 11 | static const char      RCSid[] = "$Id$";
11   #include  "paths.h"
12   #include  "otypes.h"
13   #include  "func.h"
14 + #include <ctype.h>
15  
16  
17   #define  INITFILE       "rayinit.cal"
# Line 36 | Line 37 | static double  l_erf(char *), l_erfc(char *), l_arg(ch
37  
38  
39   void
40 < initfunc()      /* initialize function evaluation */
40 > initfunc(void)  /* initialize function evaluation */
41   {
42          if (!rayinitcal[0])     /* already done? */
43                  return;
# Line 62 | Line 63 | initfunc()     /* initialize function evaluation */
63   }
64  
65  
66 + /* Set parameters for current evaluation */
67 + void
68 + set_eparams(char *prms)
69 + {
70 +        static char     *last_params;
71 +        static int      lplen = 0;
72 +        int             len;
73 +        char            vname[RMAXWORD];
74 +        double          value;
75 +        char            *cpd;
76 +                                        /* check if already set */
77 +        if (prms == NULL || !*prms)
78 +                return;
79 +        if (lplen && !strcmp(prms, last_params))
80 +                return;
81 +        len = strlen(prms);             /* record new settings */
82 +        if ((lplen != 0) & (lplen <= len)) {
83 +                free(last_params);
84 +                lplen = 0;
85 +        }
86 +        if (!lplen) {
87 +                lplen = len + 100;
88 +                last_params = (char *)malloc(lplen);
89 +                if (last_params == NULL)
90 +                        error(SYSTEM, "out of memory in set_eparams()");
91 +        }
92 +        strcpy(last_params, prms);
93 +                                        /* assign each variable */
94 +        while (*prms) {
95 +                if (isspace(*prms)) {
96 +                        ++prms; continue;
97 +                }
98 +                if (!isalpha(*prms))
99 +                        goto bad_params;
100 +                cpd = vname;
101 +                while (*prms && (*prms != '=') & !isspace(*prms)) {
102 +                        if (!isid(*prms) | (cpd-vname >= RMAXWORD-1))
103 +                                goto bad_params;
104 +                        *cpd++ = *prms++;
105 +                }
106 +                *cpd = '\0';
107 +                while (isspace(*prms)) prms++;
108 +                if (*prms++ != '=')
109 +                        goto bad_params;
110 +                value = atof(prms);
111 +                if ((prms = fskip(prms)) == NULL)
112 +                        goto bad_params;
113 +                while (isspace(*prms)) prms++;
114 +                prms += (*prms == ',') | (*prms == ';');
115 +                varset(vname, '=', value);
116 +        }
117 +        eclock++;               /* notify expression evaluator */
118 +        return;
119 + bad_params:
120 +        sprintf(errmsg, "bad parameter list '%s'", last_params);
121 +        error(USER, errmsg);
122 + }
123 +
124 +
125   MFUNC *
126   getfunc(        /* get function for this modifier */
127          OBJREC  *m,
# Line 239 | Line 299 | loadfunc(                      /* load definition file */
299  
300          if ((ffname = getpath(fname, getrlibpath(), R_OK)) == NULL) {
301                  sprintf(errmsg, "cannot find function file \"%s\"", fname);
302 <                error(USER, errmsg);
302 >                error(SYSTEM, errmsg);
303          }
304          fcompile(ffname);
305   }
# Line 251 | Line 311 | l_arg(char *nm)                        /* return nth real argument */
311          int  n;
312  
313          if (fobj == NULL)
314 <                error(USER, "arg(n) called without a context");
314 >                error(INTERNAL, "arg(n) called without a modifier context");
315  
316          n = argument(1) + .5;           /* round to integer */
317  
# Line 305 | Line 365 | chanvalue(                     /* return channel n to calcomp */
365                                  fray->ron[2]*funcxf.xfm[2][n-3] )
366                           / funcxf.sca );
367  
368 <        if (n <= 8)                     /* intersection */
368 >        if (n <= 8) {                   /* intersection point */
369 >                if (fray->rot >= FHUGE)
370 >                        return(0.0);    /* XXX should be runtime error? */
371  
372                  return( fray->rop[0]*funcxf.xfm[0][n-6] +
373                                  fray->rop[1]*funcxf.xfm[1][n-6] +
374                                  fray->rop[2]*funcxf.xfm[2][n-6] +
375                                               funcxf.xfm[3][n-6] );
376 +        }
377  
378          if (n == 9)                     /* total distance */
379                  return(raydist(fray,PRIMARY) * funcxf.sca);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines