ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 1.7
Committed: Wed Oct 18 23:15:37 1989 UTC (34 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.6: +28 -22 lines
Log Message:
added check for zero scalefactor

File Contents

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