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, 1 month 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

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