ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 1.8
Committed: Tue Feb 20 18:02:30 1990 UTC (34 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.7: +13 -7 lines
Log Message:
moved array and index back before transformation

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     * xf.c - routines to convert transform arguments into 4X4 matrix.
9     *
10     * 1/28/86
11     */
12    
13    
14     #define PI 3.14159265358979323846
15 greg 1.6 #define d2r(a) ((PI/180.)*(a))
16 greg 1.1
17 greg 1.6 #define checkarg(a,n) if (av[i][a] || i+n >= ac) goto done
18 greg 1.1
19 greg 1.2
20 greg 1.1 int
21 greg 1.4 xf(retmat, retsca, ac, av) /* get transform specification */
22     double retmat[4][4];
23     double *retsca;
24 greg 1.1 int ac;
25     char *av[];
26     {
27     double atof(), sin(), cos();
28 greg 1.4 double xfmat[4][4], m4[4][4];
29 greg 1.7 double xfsca, dtmp;
30 greg 1.5 int i, icnt;
31 greg 1.1
32 greg 1.4 setident4(retmat);
33     *retsca = 1.0;
34    
35 greg 1.8 icnt = 1;
36 greg 1.4 setident4(xfmat);
37     xfsca = 1.0;
38    
39 greg 1.1 for (i = 0; i < ac && av[i][0] == '-'; i++) {
40    
41     setident4(m4);
42    
43     switch (av[i][1]) {
44    
45     case 't': /* translate */
46 greg 1.6 checkarg(2,3);
47 greg 1.1 m4[3][0] = atof(av[++i]);
48     m4[3][1] = atof(av[++i]);
49     m4[3][2] = atof(av[++i]);
50     break;
51    
52     case 'r': /* rotate */
53     switch (av[i][2]) {
54     case 'x':
55 greg 1.6 checkarg(3,1);
56 greg 1.7 dtmp = d2r(atof(av[++i]));
57     m4[1][1] = m4[2][2] = cos(dtmp);
58     m4[2][1] = -(m4[1][2] = sin(dtmp));
59 greg 1.1 break;
60     case 'y':
61 greg 1.6 checkarg(3,1);
62 greg 1.7 dtmp = d2r(atof(av[++i]));
63     m4[0][0] = m4[2][2] = cos(dtmp);
64     m4[0][2] = -(m4[2][0] = sin(dtmp));
65 greg 1.1 break;
66     case 'z':
67 greg 1.6 checkarg(3,1);
68 greg 1.7 dtmp = d2r(atof(av[++i]));
69     m4[0][0] = m4[1][1] = cos(dtmp);
70     m4[1][0] = -(m4[0][1] = sin(dtmp));
71 greg 1.1 break;
72     default:
73     return(i);
74     }
75     break;
76    
77     case 's': /* scale */
78 greg 1.6 checkarg(2,1);
79 greg 1.7 dtmp = atof(av[i+1]);
80     if (dtmp == 0.0) goto done;
81     i++;
82 greg 1.4 xfsca *=
83 greg 1.1 m4[0][0] =
84     m4[1][1] =
85 greg 1.7 m4[2][2] = dtmp;
86 greg 1.1 break;
87    
88     case 'm': /* mirror */
89     switch (av[i][2]) {
90     case 'x':
91 greg 1.6 checkarg(3,0);
92 greg 1.4 xfsca *=
93 greg 1.1 m4[0][0] = -1.0;
94     break;
95     case 'y':
96 greg 1.6 checkarg(3,0);
97 greg 1.4 xfsca *=
98 greg 1.1 m4[1][1] = -1.0;
99     break;
100     case 'z':
101 greg 1.6 checkarg(3,0);
102 greg 1.4 xfsca *=
103 greg 1.1 m4[2][2] = -1.0;
104     break;
105     default:
106     return(i);
107     }
108     break;
109    
110 greg 1.4 case 'i': /* iterate */
111 greg 1.6 checkarg(2,1);
112 greg 1.5 while (icnt-- > 0) {
113 greg 1.4 multmat4(retmat, retmat, xfmat);
114     *retsca *= xfsca;
115     }
116 greg 1.8 icnt = atoi(av[++i]);
117 greg 1.4 setident4(xfmat);
118     xfsca = 1.0;
119 greg 1.8 continue;
120 greg 1.4
121 greg 1.1 default:
122     return(i);
123    
124     }
125     multmat4(xfmat, xfmat, m4);
126     }
127 greg 1.4 done:
128 greg 1.8 while (icnt-- > 0) {
129     multmat4(retmat, retmat, xfmat);
130     *retsca *= xfsca;
131     }
132 greg 1.1 return(i);
133     }
134    
135    
136     #ifdef INVXF
137     int
138 greg 1.4 invxf(retmat, retsca, ac, av) /* invert transform specification */
139     double retmat[4][4];
140     double *retsca;
141 greg 1.1 int ac;
142     char *av[];
143     {
144     double atof(), sin(), cos();
145 greg 1.4 double xfmat[4][4], m4[4][4];
146 greg 1.7 double xfsca, dtmp;
147 greg 1.5 int i, icnt;
148 greg 1.1
149 greg 1.4 setident4(retmat);
150     *retsca = 1.0;
151    
152 greg 1.8 icnt = 1;
153 greg 1.4 setident4(xfmat);
154     xfsca = 1.0;
155    
156 greg 1.1 for (i = 0; i < ac && av[i][0] == '-'; i++) {
157    
158     setident4(m4);
159    
160     switch (av[i][1]) {
161    
162     case 't': /* translate */
163 greg 1.6 checkarg(2,3);
164 greg 1.1 m4[3][0] = -atof(av[++i]);
165     m4[3][1] = -atof(av[++i]);
166     m4[3][2] = -atof(av[++i]);
167     break;
168    
169     case 'r': /* rotate */
170     switch (av[i][2]) {
171     case 'x':
172 greg 1.6 checkarg(3,1);
173 greg 1.7 dtmp = -d2r(atof(av[++i]));
174     m4[1][1] = m4[2][2] = cos(dtmp);
175     m4[2][1] = -(m4[1][2] = sin(dtmp));
176 greg 1.1 break;
177     case 'y':
178 greg 1.6 checkarg(3,1);
179 greg 1.7 dtmp = -d2r(atof(av[++i]));
180     m4[0][0] = m4[2][2] = cos(dtmp);
181     m4[0][2] = -(m4[2][0] = sin(dtmp));
182 greg 1.1 break;
183     case 'z':
184 greg 1.6 checkarg(3,1);
185 greg 1.7 dtmp = -d2r(atof(av[++i]));
186     m4[0][0] = m4[1][1] = cos(dtmp);
187     m4[1][0] = -(m4[0][1] = sin(dtmp));
188 greg 1.1 break;
189     default:
190     return(i);
191     }
192     break;
193    
194     case 's': /* scale */
195 greg 1.6 checkarg(2,1);
196 greg 1.7 dtmp = atof(av[i+1]);
197     if (dtmp == 0.0) goto done;
198     i++;
199 greg 1.5 xfsca *=
200 greg 1.1 m4[0][0] =
201     m4[1][1] =
202 greg 1.7 m4[2][2] = 1.0 / dtmp;
203 greg 1.1 break;
204    
205     case 'm': /* mirror */
206     switch (av[i][2]) {
207     case 'x':
208 greg 1.6 checkarg(3,0);
209 greg 1.5 xfsca *=
210 greg 1.1 m4[0][0] = -1.0;
211     break;
212     case 'y':
213 greg 1.6 checkarg(3,0);
214 greg 1.5 xfsca *=
215 greg 1.1 m4[1][1] = -1.0;
216     break;
217     case 'z':
218 greg 1.6 checkarg(3,0);
219 greg 1.5 xfsca *=
220 greg 1.1 m4[2][2] = -1.0;
221     break;
222     default:
223     return(i);
224     }
225     break;
226    
227 greg 1.4 case 'i': /* iterate */
228 greg 1.6 checkarg(2,1);
229 greg 1.5 while (icnt-- > 0) {
230 greg 1.4 multmat4(retmat, xfmat, retmat);
231     *retsca *= xfsca;
232     }
233 greg 1.8 icnt = atoi(av[++i]);
234 greg 1.4 setident4(xfmat);
235     xfsca = 1.0;
236     break;
237    
238 greg 1.1 default:
239     return(i);
240    
241     }
242     multmat4(xfmat, m4, xfmat); /* left multiply */
243 greg 1.4 }
244     done:
245 greg 1.8 while (icnt-- > 0) {
246     multmat4(retmat, xfmat, retmat);
247     *retsca *= xfsca;
248     }
249 greg 1.1 return(i);
250     }
251     #endif