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.3 by greg, Tue Dec 24 17:43:43 1991 UTC vs.
Revision 2.14 by greg, Sat Feb 22 02:07:28 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1991 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  func.c - interface to calcomp functions.
6 + */
7 +
8 + /* ====================================================================
9 + * The Radiance Software License, Version 1.0
10   *
11 < *     4/7/86
11 > * Copyright (c) 1990 - 2002 The Regents of the University of California,
12 > * through Lawrence Berkeley National Laboratory.   All rights reserved.
13 > *
14 > * Redistribution and use in source and binary forms, with or without
15 > * modification, are permitted provided that the following conditions
16 > * are met:
17 > *
18 > * 1. Redistributions of source code must retain the above copyright
19 > *         notice, this list of conditions and the following disclaimer.
20 > *
21 > * 2. Redistributions in binary form must reproduce the above copyright
22 > *       notice, this list of conditions and the following disclaimer in
23 > *       the documentation and/or other materials provided with the
24 > *       distribution.
25 > *
26 > * 3. The end-user documentation included with the redistribution,
27 > *           if any, must include the following acknowledgment:
28 > *             "This product includes Radiance software
29 > *                 (http://radsite.lbl.gov/)
30 > *                 developed by the Lawrence Berkeley National Laboratory
31 > *               (http://www.lbl.gov/)."
32 > *       Alternately, this acknowledgment may appear in the software itself,
33 > *       if and wherever such third-party acknowledgments normally appear.
34 > *
35 > * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
36 > *       and "The Regents of the University of California" must
37 > *       not be used to endorse or promote products derived from this
38 > *       software without prior written permission. For written
39 > *       permission, please contact [email protected].
40 > *
41 > * 5. Products derived from this software may not be called "Radiance",
42 > *       nor may "Radiance" appear in their name, without prior written
43 > *       permission of Lawrence Berkeley National Laboratory.
44 > *
45 > * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
46 > * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
47 > * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
48 > * DISCLAIMED.   IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
49 > * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50 > * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
51 > * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
52 > * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
53 > * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
54 > * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
55 > * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56 > * SUCH DAMAGE.
57 > * ====================================================================
58 > *
59 > * This software consists of voluntary contributions made by many
60 > * individuals on behalf of Lawrence Berkeley National Laboratory.   For more
61 > * information on Lawrence Berkeley National Laboratory, please see
62 > * <http://www.lbl.gov/>.
63   */
64  
65   #include  "ray.h"
# Line 18 | Line 70 | static char SCCSid[] = "$SunId$ LBL";
70  
71  
72   #define  INITFILE       "rayinit.cal"
21 #define  REFVNAME       "`FILE_REFCNT"
73   #define  CALSUF         ".cal"
74   #define  LCALSUF        4
75 + char  REFVNAME[] = "`FILE_REFCNT";
76  
77   XF  unitxf = {                  /* identity transform */
78 <        1.0, 0.0, 0.0, 0.0,
79 <        0.0, 1.0, 0.0, 0.0,
80 <        0.0, 0.0, 1.0, 0.0,
81 <        0.0, 0.0, 0.0, 1.0,
78 >        {{1.0, 0.0, 0.0, 0.0},
79 >        {0.0, 1.0, 0.0, 0.0},
80 >        {0.0, 0.0, 1.0, 0.0},
81 >        {0.0, 0.0, 0.0, 1.0}},
82          1.0
83   };
84  
# Line 41 | Line 93 | MFUNC *
93   getfunc(m, ff, ef, dofwd)       /* get function for this modifier */
94   OBJREC  *m;
95   int  ff;
96 < unsigned  ef;
96 > unsigned int  ef;
97   int  dofwd;
98   {
47        extern EPNODE  *curfunc;
99          static char  initfile[] = INITFILE;
100          char  sbuf[MAXSTR];
101          register char  **arg;
# Line 54 | Line 105 | int  dofwd;
105                                          /* check to see if done already */
106          if ((f = (MFUNC *)m->os) != NULL)
107                  return(f);
108 +        fobj = NULL; fray = NULL;
109          if (initfile[0]) {              /* initialize on first call */
110 +                esupport |= E_VARIABLE|E_FUNCTION|E_INCHAN|E_RCONST|E_REDEFW;
111 +                esupport &= ~(E_OUTCHAN);
112                  setcontext("");
113                  scompile("Dx=$1;Dy=$2;Dz=$3;", NULL, 0);
114                  scompile("Nx=$4;Ny=$5;Nz=$6;", NULL, 0);
115                  scompile("Px=$7;Py=$8;Pz=$9;", NULL, 0);
116 <                scompile("T=$10;Rdot=$11;", NULL, 0);
116 >                scompile("T=$10;Ts=$25;Rdot=$11;", NULL, 0);
117                  scompile("S=$12;Tx=$13;Ty=$14;Tz=$15;", NULL, 0);
118                  scompile("Ix=$16;Iy=$17;Iz=$18;", NULL, 0);
119                  scompile("Jx=$19;Jy=$20;Jz=$21;", NULL, 0);
# Line 68 | Line 122 | int  dofwd;
122                  funset("erf", 1, ':', l_erf);
123                  funset("erfc", 1, ':', l_erfc);
124                  setnoisefuncs();
125 +                setprismfuncs();
126                  loadfunc(initfile);
127                  initfile[0] = '\0';
128          }
# Line 80 | Line 135 | int  dofwd;
135          if (i == 1 && arg[ff][0] == '.')
136                  setcontext(f->ctx = "");        /* "." means no file */
137          else {
138 <                strcpy(sbuf,m->oargs.sarg[ff]); /* file name is context */
138 >                strcpy(sbuf,arg[ff]);           /* file name is context */
139                  if (i > LCALSUF && !strcmp(sbuf+i-LCALSUF, CALSUF))
140                          sbuf[i-LCALSUF] = '\0'; /* remove suffix */
141                  setcontext(f->ctx = savestr(sbuf));
142                  if (!vardefined(REFVNAME)) {    /* file loaded? */
143 <                        loadfunc(m->oargs.sarg[ff]);
143 >                        loadfunc(arg[ff]);
144                          varset(REFVNAME, '=', 1.0);
145                  } else                          /* reference_count++ */
146                          varset(REFVNAME, '=', varvalue(REFVNAME)+1.0);
# Line 127 | Line 182 | int  dofwd;
182          m->os = (char *)f;
183          return(f);
184   toofew:
185 <        objerror(m, USER, "too few arguments");
185 >        objerror(m, USER, "too few string arguments");
186   memerr:
187          error(SYSTEM, "out of memory in getfunc");
188   }
189  
190  
191 + void
192   freefunc(m)                     /* free memory associated with modifier */
193   OBJREC  *m;
194   {
# Line 153 | Line 209 | OBJREC  *m;
209                  freestr(f->ctx);
210          }
211          if (f->b != &unitxf)
212 <                free((char *)f->b);
212 >                free((void *)f->b);
213          if (f->f != NULL && f->f != &unitxf)
214 <                free((char *)f->f);
215 <        free((char *)f);
214 >                free((void *)f->f);
215 >        free((void *)f);
216          m->os = NULL;
217   }
218  
219  
220 + int
221   setfunc(m, r)                   /* set channels for function call */
222   OBJREC  *m;
223   register RAY  *r;
224   {
225 <        static long  lastrno = -1;
225 >        static unsigned long  lastrno = ~0;
226          register MFUNC  *f;
227                                          /* get function */
228          if ((f = (MFUNC *)m->os) == NULL)
229 <                error(m, CONSISTENCY, "setfunc called before getfunc");
229 >                objerror(m, CONSISTENCY, "setfunc called before getfunc");
230                                          /* set evaluator context */
231          setcontext(f->ctx);
232                                          /* check to see if matrix set */
# Line 191 | Line 248 | register RAY  *r;
248   }
249  
250  
251 + void
252   loadfunc(fname)                 /* load definition file */
253   char  *fname;
254   {
197        extern char  *libpath;          /* library search path */
255          char  *ffname;
256  
257 <        if ((ffname = getpath(fname, libpath, R_OK)) == NULL) {
257 >        if ((ffname = getpath(fname, getlibpath(), R_OK)) == NULL) {
258                  sprintf(errmsg, "cannot find function file \"%s\"", fname);
259                  error(USER, errmsg);
260          }
# Line 208 | Line 265 | char  *fname;
265   static double
266   l_arg()                         /* return nth real argument */
267   {
211        extern double  argument();
268          register int  n;
269  
270 +        if (fobj == NULL)
271 +                syntax("arg(n) used in constant expression");
272 +
273          n = argument(1) + .5;           /* round to integer */
274  
275          if (n < 1)
# Line 246 | Line 305 | double
305   chanvalue(n)                    /* return channel n to calcomp */
306   register int  n;
307   {
308 <        double  sum;
309 <        register RAY  *r;
308 >        if (fray == NULL)
309 >                syntax("ray parameter used in constant expression");
310  
311          if (--n < 0)
312                  goto badchan;
# Line 273 | Line 332 | register int  n;
332                                  fray->rop[2]*funcxf.xfm[2][n-6] +
333                                               funcxf.xfm[3][n-6] );
334  
335 <        if (n == 9) {                   /* distance */
335 >        if (n == 9)                     /* total distance */
336 >                return(raydist(fray,PRIMARY) * funcxf.sca);
337  
278                sum = fray->rot;
279                for (r = fray->parent; r != NULL; r = r->parent)
280                        sum += r->rot;
281                return(sum * funcxf.sca);
282
283        }
338          if (n == 10)                    /* dot product (range [-1,1]) */
339                  return( fray->rod <= -1.0 ? -1.0 :
340                          fray->rod >= 1.0 ? 1.0 :
# Line 300 | Line 354 | register int  n;
354  
355          if (n < 24)                     /* k unit vector */
356                  return(funcxf.xfm[2][n-21] / funcxf.sca);
357 +
358 +        if (n == 24)                    /* single ray (shadow) distance */
359 +                return((fray->rot+raydist(fray->parent,SHADOW)) * funcxf.sca);
360   badchan:
361          error(USER, "illegal channel number");
362   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines