ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 2.3
Committed: Tue Dec 24 17:42:48 1991 UTC (32 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.2: +7 -7 lines
Log Message:
changed the error returns

File Contents

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