ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 1.11
Committed: Wed Oct 23 15:19:25 1991 UTC (32 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.10: +2 -2 lines
Log Message:
added FLOAT definition

File Contents

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