ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/mx_data.c
Revision: 2.7
Committed: Tue Feb 25 02:47:22 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.6: +1 -56 lines
Log Message:
Replaced inline copyright notice with #include "copyright.h"

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.6 static const char RCSid[] = "$Id$";
3 greg 1.1 #endif
4     /*
5     * mx_data.c - routine for stored mixtures.
6 greg 2.6 */
7    
8 greg 2.7 #include "copyright.h"
9 greg 1.1
10     #include "ray.h"
11    
12     #include "data.h"
13    
14 greg 2.2 #include "func.h"
15    
16 greg 1.1 /*
17 gwlarson 2.5 * A stored mixture is specified:
18 greg 1.1 *
19     * modifier mixdata name
20     * 6+ foremod backmod func dfname vfname v0 v1 .. xf
21     * 0
22     * n A1 A2 ..
23     *
24 gwlarson 2.5 * A picture mixture is specified as:
25     *
26     * modifier mixpict name
27     * 7+ foremod backmod func pfname vfname vx vy xf
28     * 0
29     * n A1 A2 ..
30     *
31     *
32 greg 1.1 * Vfname is the name of the file where the variable definitions
33     * can be found. The list of real arguments can be accessed by
34     * definitions in the file. Dfname is the data file.
35 gwlarson 2.5 * (Pfname is a picture file.)
36 greg 1.1 * The dimensions of the data files and the number
37     * of variables must match. The func is a single argument
38 gwlarson 2.5 * function in the case of mixdata (three argument in the case
39     * of mixpict), which returns the corrected data value given the
40 greg 1.1 * interpolated value from the file. The xf is a transformation
41     * to get from the original coordinates to the current coordinates.
42     */
43    
44    
45     mx_data(m, r) /* interpolate mixture data */
46     register OBJREC *m;
47     RAY *r;
48     {
49 gwlarson 2.4 OBJECT obj;
50 greg 1.1 double coef;
51     double pt[MAXDIM];
52     DATARRAY *dp;
53     OBJECT mod[2];
54 greg 2.2 register MFUNC *mf;
55     register int i;
56 greg 1.1
57     if (m->oargs.nsargs < 6)
58     objerror(m, USER, "bad # arguments");
59 gwlarson 2.4 obj = objndx(m);
60 greg 1.1 for (i = 0; i < 2; i++)
61 greg 2.2 if (!strcmp(m->oargs.sarg[i], VOIDID))
62 greg 1.1 mod[i] = OVOID;
63 gwlarson 2.4 else if ((mod[i] = lastmod(obj, m->oargs.sarg[i])) == OVOID) {
64 greg 2.2 sprintf(errmsg, "undefined modifier \"%s\"",
65     m->oargs.sarg[i]);
66 greg 1.1 objerror(m, USER, errmsg);
67     }
68 greg 2.2 dp = getdata(m->oargs.sarg[3]);
69     i = (1 << dp->nd) - 1;
70     mf = getfunc(m, 4, i<<5, 0);
71     setfunc(m, r);
72     errno = 0;
73     for (i = 0; i < dp->nd; i++) {
74     pt[i] = evalue(mf->ep[i]);
75 greg 1.1 if (errno)
76     goto computerr;
77     }
78     coef = datavalue(dp, pt);
79     errno = 0;
80 greg 2.2 coef = funvalue(m->oargs.sarg[2], 1, &coef);
81 gwlarson 2.5 if (errno)
82     goto computerr;
83     if (raymixture(r, mod[0], mod[1], coef)) {
84     if (m->omod != OVOID)
85     objerror(m, USER, "inappropriate modifier");
86     return(1);
87     }
88     return(0);
89     computerr:
90     objerror(m, WARNING, "compute error");
91     return(0);
92     }
93    
94    
95     mx_pdata(m, r) /* interpolate mixture picture */
96     register OBJREC *m;
97     RAY *r;
98     {
99     OBJECT obj;
100     double col[3], coef;
101     double pt[MAXDIM];
102     DATARRAY *dp;
103     OBJECT mod[2];
104     register MFUNC *mf;
105     register int i;
106    
107     if (m->oargs.nsargs < 7)
108     objerror(m, USER, "bad # arguments");
109     obj = objndx(m);
110     for (i = 0; i < 2; i++)
111     if (!strcmp(m->oargs.sarg[i], VOIDID))
112     mod[i] = OVOID;
113     else if ((mod[i] = lastmod(obj, m->oargs.sarg[i])) == OVOID) {
114     sprintf(errmsg, "undefined modifier \"%s\"",
115     m->oargs.sarg[i]);
116     objerror(m, USER, errmsg);
117     }
118     dp = getpict(m->oargs.sarg[3]);
119     mf = getfunc(m, 4, 0x3<<5, 0);
120     setfunc(m, r);
121     errno = 0;
122     pt[1] = evalue(mf->ep[0]); /* y major ordering */
123     pt[0] = evalue(mf->ep[1]);
124     if (errno)
125     goto computerr;
126     for (i = 0; i < 3; i++) /* get pixel from picture */
127     col[i] = datavalue(dp+i, pt);
128     errno = 0; /* evaluate function on pixel */
129     coef = funvalue(m->oargs.sarg[2], 3, col);
130 greg 1.1 if (errno)
131     goto computerr;
132 greg 2.3 if (raymixture(r, mod[0], mod[1], coef)) {
133     if (m->omod != OVOID)
134     objerror(m, USER, "inappropriate modifier");
135     return(1);
136     }
137     return(0);
138 greg 1.1 computerr:
139     objerror(m, WARNING, "compute error");
140 greg 2.3 return(0);
141 greg 1.1 }