ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/mx_data.c
Revision: 2.5
Committed: Wed Jan 20 14:10:06 1999 UTC (25 years, 3 months ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 2.4: +61 -2 lines
Log Message:
added "mixpict" primitive

File Contents

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