ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 2.7
Committed: Fri Jun 27 22:27:45 2003 UTC (20 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad4R2P2, rad5R0, rad5R1, rad3R7P2, rad3R7P1, rad4R2, rad4R1, rad4R0, rad3R6, rad3R6P1, rad3R8, rad3R9, rad4R2P1
Changes since 2.6: +2 -1 lines
Log Message:
Fixed a couple of bugs from last changes where atof() declaration was lost

File Contents

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