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

# User Rev Content
1 greg 1.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 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.4 xf(retmat, retsca, ac, av) /* get transform specification */
22     double retmat[4][4];
23     double *retsca;
24 greg 1.1 int ac;
25     char *av[];
26     {
27     double atof(), sin(), cos();
28 greg 1.4 double xfmat[4][4], m4[4][4];
29 greg 1.7 double xfsca, dtmp;
30 greg 1.5 int i, icnt;
31 greg 1.1
32 greg 1.4 setident4(retmat);
33     *retsca = 1.0;
34    
35     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 icnt = atoi(av[++i]);
112     while (icnt-- > 0) {
113 greg 1.4 multmat4(retmat, retmat, xfmat);
114     *retsca *= xfsca;
115     }
116     setident4(xfmat);
117     xfsca = 1.0;
118     break;
119    
120 greg 1.1 default:
121     return(i);
122    
123     }
124     multmat4(xfmat, xfmat, m4);
125     }
126 greg 1.4 done:
127 greg 1.5 multmat4(retmat, retmat, xfmat);
128     *retsca *= xfsca;
129 greg 1.1 return(i);
130     }
131    
132    
133     #ifdef INVXF
134     int
135 greg 1.4 invxf(retmat, retsca, ac, av) /* invert transform specification */
136     double retmat[4][4];
137     double *retsca;
138 greg 1.1 int ac;
139     char *av[];
140     {
141     double atof(), sin(), cos();
142 greg 1.4 double xfmat[4][4], m4[4][4];
143 greg 1.7 double xfsca, dtmp;
144 greg 1.5 int i, icnt;
145 greg 1.1
146 greg 1.4 setident4(retmat);
147     *retsca = 1.0;
148    
149     setident4(xfmat);
150     xfsca = 1.0;
151    
152 greg 1.1 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 greg 1.6 checkarg(2,3);
160 greg 1.1 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 greg 1.6 checkarg(3,1);
169 greg 1.7 dtmp = -d2r(atof(av[++i]));
170     m4[1][1] = m4[2][2] = cos(dtmp);
171     m4[2][1] = -(m4[1][2] = sin(dtmp));
172 greg 1.1 break;
173     case 'y':
174 greg 1.6 checkarg(3,1);
175 greg 1.7 dtmp = -d2r(atof(av[++i]));
176     m4[0][0] = m4[2][2] = cos(dtmp);
177     m4[0][2] = -(m4[2][0] = sin(dtmp));
178 greg 1.1 break;
179     case 'z':
180 greg 1.6 checkarg(3,1);
181 greg 1.7 dtmp = -d2r(atof(av[++i]));
182     m4[0][0] = m4[1][1] = cos(dtmp);
183     m4[1][0] = -(m4[0][1] = sin(dtmp));
184 greg 1.1 break;
185     default:
186     return(i);
187     }
188     break;
189    
190     case 's': /* scale */
191 greg 1.6 checkarg(2,1);
192 greg 1.7 dtmp = atof(av[i+1]);
193     if (dtmp == 0.0) goto done;
194     i++;
195 greg 1.5 xfsca *=
196 greg 1.1 m4[0][0] =
197     m4[1][1] =
198 greg 1.7 m4[2][2] = 1.0 / dtmp;
199 greg 1.1 break;
200    
201     case 'm': /* mirror */
202     switch (av[i][2]) {
203     case 'x':
204 greg 1.6 checkarg(3,0);
205 greg 1.5 xfsca *=
206 greg 1.1 m4[0][0] = -1.0;
207     break;
208     case 'y':
209 greg 1.6 checkarg(3,0);
210 greg 1.5 xfsca *=
211 greg 1.1 m4[1][1] = -1.0;
212     break;
213     case 'z':
214 greg 1.6 checkarg(3,0);
215 greg 1.5 xfsca *=
216 greg 1.1 m4[2][2] = -1.0;
217     break;
218     default:
219     return(i);
220     }
221     break;
222    
223 greg 1.4 case 'i': /* iterate */
224 greg 1.6 checkarg(2,1);
225 greg 1.5 icnt = atoi(av[++i]);
226     while (icnt-- > 0) {
227 greg 1.4 multmat4(retmat, xfmat, retmat);
228     *retsca *= xfsca;
229     }
230     setident4(xfmat);
231     xfsca = 1.0;
232     break;
233    
234 greg 1.1 default:
235     return(i);
236    
237     }
238     multmat4(xfmat, m4, xfmat); /* left multiply */
239 greg 1.4 }
240     done:
241 greg 1.5 multmat4(retmat, xfmat, retmat);
242     *retsca *= xfsca;
243 greg 1.1 return(i);
244     }
245     #endif