ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/xf.c
Revision: 1.5
Committed: Fri Oct 6 09:39:42 1989 UTC (34 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.4: +14 -22 lines
Log Message:
Iteration now given after transformation.

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    
16 greg 1.4 #define checkarg(a,n) if (strcmp(av[i],a) || i+n >= ac) goto done
17 greg 1.1
18 greg 1.2
19 greg 1.1 int
20 greg 1.4 xf(retmat, retsca, ac, av) /* get transform specification */
21     double retmat[4][4];
22     double *retsca;
23 greg 1.1 int ac;
24     char *av[];
25     {
26     double atof(), sin(), cos();
27 greg 1.4 double xfmat[4][4], m4[4][4];
28     double xfsca, theta;
29 greg 1.5 int i, icnt;
30 greg 1.1
31 greg 1.4 setident4(retmat);
32     *retsca = 1.0;
33    
34     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.2 checkarg("-t",3);
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.2 checkarg("-rx",1);
54 greg 1.1 theta = PI/180.0 * atof(av[++i]);
55     m4[1][1] = m4[2][2] = cos(theta);
56     m4[2][1] = -(m4[1][2] = sin(theta));
57     break;
58     case 'y':
59 greg 1.2 checkarg("-ry",1);
60 greg 1.3 theta = PI/180.0 * atof(av[++i]);
61 greg 1.1 m4[0][0] = m4[2][2] = cos(theta);
62     m4[0][2] = -(m4[2][0] = sin(theta));
63     break;
64     case 'z':
65 greg 1.2 checkarg("-rz",1);
66 greg 1.3 theta = PI/180.0 * atof(av[++i]);
67 greg 1.1 m4[0][0] = m4[1][1] = cos(theta);
68     m4[1][0] = -(m4[0][1] = sin(theta));
69     break;
70     default:
71     return(i);
72     }
73     break;
74    
75     case 's': /* scale */
76 greg 1.2 checkarg("-s",1);
77 greg 1.4 xfsca *=
78 greg 1.1 m4[0][0] =
79     m4[1][1] =
80     m4[2][2] = atof(av[++i]);
81     break;
82    
83     case 'm': /* mirror */
84     switch (av[i][2]) {
85     case 'x':
86 greg 1.2 checkarg("-mx",0);
87 greg 1.4 xfsca *=
88 greg 1.1 m4[0][0] = -1.0;
89     break;
90     case 'y':
91 greg 1.2 checkarg("-my",0);
92 greg 1.4 xfsca *=
93 greg 1.1 m4[1][1] = -1.0;
94     break;
95     case 'z':
96 greg 1.2 checkarg("-mz",0);
97 greg 1.4 xfsca *=
98 greg 1.1 m4[2][2] = -1.0;
99     break;
100     default:
101     return(i);
102     }
103     break;
104    
105 greg 1.4 case 'i': /* iterate */
106     checkarg("-i",1);
107 greg 1.5 icnt = atoi(av[++i]);
108     while (icnt-- > 0) {
109 greg 1.4 multmat4(retmat, retmat, xfmat);
110     *retsca *= xfsca;
111     }
112     setident4(xfmat);
113     xfsca = 1.0;
114     break;
115    
116 greg 1.1 default:
117     return(i);
118    
119     }
120     multmat4(xfmat, xfmat, m4);
121     }
122 greg 1.4 done:
123 greg 1.5 multmat4(retmat, retmat, xfmat);
124     *retsca *= xfsca;
125 greg 1.1 return(i);
126     }
127    
128    
129     #ifdef INVXF
130     int
131 greg 1.4 invxf(retmat, retsca, ac, av) /* invert transform specification */
132     double retmat[4][4];
133     double *retsca;
134 greg 1.1 int ac;
135     char *av[];
136     {
137     double atof(), sin(), cos();
138 greg 1.4 double xfmat[4][4], m4[4][4];
139     double xfsca, theta;
140 greg 1.5 int i, icnt;
141 greg 1.1
142 greg 1.4 setident4(retmat);
143     *retsca = 1.0;
144    
145     setident4(xfmat);
146     xfsca = 1.0;
147    
148 greg 1.1 for (i = 0; i < ac && av[i][0] == '-'; i++) {
149    
150     setident4(m4);
151    
152     switch (av[i][1]) {
153    
154     case 't': /* translate */
155 greg 1.2 checkarg("-t",3);
156 greg 1.1 m4[3][0] = -atof(av[++i]);
157     m4[3][1] = -atof(av[++i]);
158     m4[3][2] = -atof(av[++i]);
159     break;
160    
161     case 'r': /* rotate */
162     switch (av[i][2]) {
163     case 'x':
164 greg 1.2 checkarg("-rx",1);
165 greg 1.1 theta = -PI/180.0 * atof(av[++i]);
166     m4[1][1] = m4[2][2] = cos(theta);
167     m4[2][1] = -(m4[1][2] = sin(theta));
168     break;
169     case 'y':
170 greg 1.2 checkarg("-ry",1);
171 greg 1.1 theta = -PI/180.0 * atof(av[++i]);
172     m4[0][0] = m4[2][2] = cos(theta);
173     m4[0][2] = -(m4[2][0] = sin(theta));
174     break;
175     case 'z':
176 greg 1.2 checkarg("-rz",1);
177 greg 1.1 theta = -PI/180.0 * atof(av[++i]);
178     m4[0][0] = m4[1][1] = cos(theta);
179     m4[1][0] = -(m4[0][1] = sin(theta));
180     break;
181     default:
182     return(i);
183     }
184     break;
185    
186     case 's': /* scale */
187 greg 1.2 checkarg("-s",1);
188 greg 1.5 xfsca *=
189 greg 1.1 m4[0][0] =
190     m4[1][1] =
191     m4[2][2] = 1.0 / atof(av[++i]);
192     break;
193    
194     case 'm': /* mirror */
195     switch (av[i][2]) {
196     case 'x':
197 greg 1.2 checkarg("-mx",0);
198 greg 1.5 xfsca *=
199 greg 1.1 m4[0][0] = -1.0;
200     break;
201     case 'y':
202 greg 1.2 checkarg("-my",0);
203 greg 1.5 xfsca *=
204 greg 1.1 m4[1][1] = -1.0;
205     break;
206     case 'z':
207 greg 1.2 checkarg("-mz",0);
208 greg 1.5 xfsca *=
209 greg 1.1 m4[2][2] = -1.0;
210     break;
211     default:
212     return(i);
213     }
214     break;
215    
216 greg 1.4 case 'i': /* iterate */
217     checkarg("-i",1);
218 greg 1.5 icnt = atoi(av[++i]);
219     while (icnt-- > 0) {
220 greg 1.4 multmat4(retmat, xfmat, retmat);
221     *retsca *= xfsca;
222     }
223     setident4(xfmat);
224     xfsca = 1.0;
225     break;
226    
227 greg 1.1 default:
228     return(i);
229    
230     }
231     multmat4(xfmat, m4, xfmat); /* left multiply */
232 greg 1.4 }
233     done:
234 greg 1.5 multmat4(retmat, xfmat, retmat);
235     *retsca *= xfsca;
236 greg 1.1 return(i);
237     }
238     #endif