ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/func.c
Revision: 1.6
Committed: Thu Jul 27 22:25:13 1989 UTC (34 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.5: +1 -1 lines
Log Message:
Changed getpath to check permissions

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1986 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * func.c - interface to calcomp functions.
9     *
10     * 4/7/86
11     */
12    
13     #include "ray.h"
14    
15     #include "otypes.h"
16    
17    
18     typedef struct {
19 greg 1.3 double xfm[4][4]; /* transform matrix */
20 greg 1.1 double sca; /* scalefactor */
21     } XF;
22    
23     static OBJREC *fobj; /* current function object */
24     static RAY *fray; /* current function ray */
25     static XF fxf; /* current transformation */
26    
27    
28 greg 1.3 setmap(m, r, xfm, sca) /* set channels for function call */
29 greg 1.1 OBJREC *m;
30     register RAY *r;
31 greg 1.3 double xfm[4][4];
32 greg 1.1 double sca;
33     {
34     extern double l_noise3(), l_noise3a(), l_noise3b(), l_noise3c();
35     extern double l_hermite(), l_fnoise3(), l_arg();
36     extern long eclock;
37     static char *initfile = "rayinit.cal";
38    
39     if (initfile != NULL) {
40     loadfunc(initfile);
41     scompile(NULL, "Dx=$1;Dy=$2;Dz=$3;");
42     scompile(NULL, "Nx=$4;Ny=$5;Nz=$6;");
43     scompile(NULL, "Px=$7;Py=$8;Pz=$9;");
44     scompile(NULL, "T=$10;Rdot=$11;");
45     funset("arg", 1, l_arg);
46     funset("noise3", 3, l_noise3);
47     funset("noise3a", 3, l_noise3a);
48     funset("noise3b", 3, l_noise3b);
49     funset("noise3c", 3, l_noise3c);
50     funset("hermite", 5, l_hermite);
51     funset("fnoise3", 3, l_fnoise3);
52     initfile = NULL;
53     }
54     fobj = m;
55     fray = r;
56 greg 1.4 fxf.sca = r->robs * sca;
57     multmat4(fxf.xfm, r->robx, xfm);
58 greg 1.1 eclock++; /* notify expression evaluator */
59     }
60    
61    
62     setfunc(m, r) /* simplified interface to setmap */
63     register OBJREC *m;
64     RAY *r;
65     {
66 greg 1.2 register XF *mxf;
67 greg 1.1
68 greg 1.2 if ((mxf = (XF *)m->os) == NULL) {
69 greg 1.5 register int n;
70     register char **sa;
71 greg 1.1
72 greg 1.5 for (n = m->oargs.nsargs, sa = m->oargs.sarg;
73     n > 0 && **sa != '-'; n--, sa++)
74     ;
75 greg 1.1 mxf = (XF *)malloc(sizeof(XF));
76     if (mxf == NULL)
77     goto memerr;
78     mxf->sca = 1.0;
79     setident4(mxf->xfm);
80     if (invxf(mxf->xfm, &mxf->sca, n, sa) != n)
81     objerror(m, USER, "bad transform");
82     if (mxf->sca < 0.0)
83     mxf->sca = -mxf->sca;
84 greg 1.2 m->os = (char *)mxf;
85 greg 1.1 }
86 greg 1.3 setmap(m, r, mxf->xfm, mxf->sca);
87 greg 1.1 return;
88     memerr:
89     error(SYSTEM, "out of memory in setfunc");
90     #undef mxf
91     }
92    
93    
94     loadfunc(fname) /* load definition file */
95     char *fname;
96     {
97     extern char *libpath; /* library search path */
98     char *ffname;
99    
100 greg 1.6 if ((ffname = getpath(fname, libpath, R_OK)) == NULL) {
101 greg 1.1 sprintf(errmsg, "cannot find function file \"%s\"", fname);
102     error(USER, errmsg);
103     }
104     fcompile(ffname);
105     }
106    
107    
108     double
109     l_arg() /* return nth real argument */
110     {
111     extern double argument();
112     register int n;
113    
114     n = argument(1) + .5; /* round to integer */
115    
116     if (n < 1)
117     return(fobj->oargs.nfargs);
118    
119     if (n > fobj->oargs.nfargs) {
120     sprintf(errmsg, "missing real argument %d", n);
121     objerror(fobj, USER, errmsg);
122     }
123     return(fobj->oargs.farg[n-1]);
124     }
125    
126    
127     double
128     chanvalue(n) /* return channel n to calcomp */
129     register int n;
130     {
131     double res;
132     register RAY *r;
133    
134     n--; /* for convenience */
135    
136     if (n < 0 || n > 10)
137     error(USER, "illegal channel number");
138    
139     if (n == 9) { /* distance */
140    
141     res = fray->rot;
142     for (r = fray->parent; r != NULL; r = r->parent)
143     res += r->rot;
144     res *= fxf.sca;
145    
146     } else if (n == 10) { /* dot product */
147    
148     res = fray->rod;
149    
150     } else if (n < 3) { /* ray direction */
151     res = ( fray->rdir[0]*fxf.xfm[0][n] +
152     fray->rdir[1]*fxf.xfm[1][n] +
153     fray->rdir[2]*fxf.xfm[2][n] )
154     / fxf.sca ;
155     } else if (n < 6) { /* surface normal */
156     res = ( fray->ron[0]*fxf.xfm[0][n-3] +
157     fray->ron[1]*fxf.xfm[1][n-3] +
158     fray->ron[2]*fxf.xfm[2][n-3] )
159     / fxf.sca ;
160     } else { /* intersection */
161     res = fray->rop[0]*fxf.xfm[0][n-6] +
162     fray->rop[1]*fxf.xfm[1][n-6] +
163     fray->rop[2]*fxf.xfm[2][n-6] +
164     fxf.xfm[3][n-6] ;
165     }
166    
167     return(res);
168     }