ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 2.8
Committed: Thu Apr 2 20:44:15 2020 UTC (4 years ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R3, HEAD
Changes since 2.7: +4 -13 lines
Log Message:
Added -x option to robjutil to transform .OBJ files

File Contents

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