ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/vwrays.c
Revision: 3.10
Committed: Fri Mar 26 23:34:23 2004 UTC (20 years ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R6, rad3R6P1
Changes since 3.9: +35 -15 lines
Log Message:
Continued ANSIfication.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: vwrays.c,v 3.9 2003/10/22 02:06:35 greg Exp $";
3 #endif
4 /*
5 * Compute rays corresponding to a given picture or view.
6 */
7
8 #include "platform.h"
9 #include "standard.h"
10 #include "view.h"
11
12 typedef void putfunc(FVECT ro, FVECT rd);
13 static putfunc puta;
14 static putfunc putf;
15 static putfunc putd;
16 static void pix2rays(FILE *fp);
17 static void putrays(void);
18
19 static putfunc *putr = puta;
20
21 VIEW vw = STDVIEW;
22
23 RESOLU rs = {PIXSTANDARD, 512, 512};
24
25 double pa = 1.;
26
27 int zfd = -1;
28
29 int fromstdin = 0;
30
31 char *progname;
32
33
34 int
35 main(
36 int argc,
37 char *argv[]
38 )
39 {
40 char *err;
41 int rval, getdim = 0;
42 register int i;
43
44 progname = argv[0];
45 if (argc < 2)
46 goto userr;
47 for (i = 1; i < argc && argv[i][0] == '-'; i++)
48 switch (argv[i][1]) {
49 case 'f': /* output format */
50 switch (argv[i][2]) {
51 case 'a': /* ASCII */
52 putr = puta;
53 break;
54 case 'f': /* float */
55 putr = putf;
56 break;
57 case 'd': /* double */
58 putr = putd;
59 break;
60 default:
61 goto userr;
62 }
63 break;
64 case 'v': /* view file or option */
65 if (argv[i][2] == 'f') {
66 rval = viewfile(argv[++i], &vw, NULL);
67 if (rval <= 0) {
68 fprintf(stderr,
69 "%s: no view in file\n",
70 argv[i]);
71 exit(1);
72 }
73 break;
74 }
75 rval = getviewopt(&vw, argc-i, argv+i);
76 if (rval < 0)
77 goto userr;
78 i += rval;
79 break;
80 case 'd': /* report dimensions only */
81 getdim++;
82 break;
83 case 'x': /* x resolution */
84 rs.xr = atoi(argv[++i]);
85 if (rs.xr <= 0) {
86 fprintf(stderr, "%s: bad x resolution\n",
87 progname);
88 exit(1);
89 }
90 break;
91 case 'y': /* y resolution */
92 rs.yr = atoi(argv[++i]);
93 if (rs.yr <= 0) {
94 fprintf(stderr, "%s: bad y resolution\n",
95 progname);
96 exit(1);
97 }
98 break;
99 case 'p': /* pixel aspect ratio */
100 pa = atof(argv[++i]);
101 break;
102 case 'i': /* get pixels from stdin */
103 fromstdin = 1;
104 break;
105 default:
106 goto userr;
107 }
108 if ((i > argc) | (i+2 < argc))
109 goto userr;
110 if (i < argc) {
111 rval = viewfile(argv[i], &vw, &rs);
112 if (rval <= 0) {
113 fprintf(stderr, "%s: no view in picture\n", argv[i]);
114 exit(1);
115 }
116 if (i+1 < argc) {
117 zfd = open(argv[i+1], O_RDONLY);
118 if (zfd < 0) {
119 fprintf(stderr,
120 "%s: cannot open depth buffer\n",
121 argv[i+1]);
122 exit(1);
123 }
124 }
125 }
126 if ((err = setview(&vw)) != NULL) {
127 fprintf(stderr, "%s: %s\n", progname, err);
128 exit(1);
129 }
130 if (i == argc)
131 normaspect(viewaspect(&vw), &pa, &rs.xr, &rs.yr);
132 if (getdim) {
133 printf("-x %d -y %d -ld%c\n", rs.xr, rs.yr,
134 vw.vaft > FTINY ? '+' : '-');
135 exit(0);
136 }
137 if (fromstdin)
138 pix2rays(stdin);
139 else
140 putrays();
141 exit(0);
142 userr:
143 fprintf(stderr,
144 "Usage: %s [ -i -f{a|f|d} | -d ] { view opts .. | picture [zbuf] }\n",
145 progname);
146 exit(1);
147 }
148
149
150 static void
151 pix2rays(
152 FILE *fp
153 )
154 {
155 static FVECT rorg, rdir;
156 float zval;
157 double px, py;
158 int pp[2];
159 double d;
160 register int i;
161
162 while (fscanf(fp, "%lf %lf", &px, &py) == 2) {
163 if (px < 0 || px >= rs.xr ||
164 py < 0 || py >= rs.yr) {
165 fprintf(stderr,
166 "%s: (x,y) pair (%.0f,%.0f) out of range\n",
167 progname, px, py);
168 exit(1);
169 }
170 if (zfd >= 0) {
171 loc2pix(pp, &rs, px/rs.xr, py/rs.yr);
172 if (lseek(zfd,
173 (pp[1]*scanlen(&rs)+pp[0])*sizeof(float),
174 SEEK_SET) < 0 ||
175 read(zfd, &zval, sizeof(float))
176 < sizeof(float)) {
177 fprintf(stderr, "%s: depth buffer read error\n",
178 progname);
179 exit(1);
180 }
181 }
182 d = viewray(rorg, rdir, &vw, px/rs.xr, py/rs.yr);
183 if (d < -FTINY)
184 rorg[0] = rorg[1] = rorg[2] =
185 rdir[0] = rdir[1] = rdir[2] = 0.;
186 else if (zfd >= 0)
187 for (i = 0; i < 3; i++) {
188 rorg[i] += rdir[i]*zval;
189 rdir[i] = -rdir[i];
190 }
191 else if (d > FTINY) {
192 rdir[0] *= d; rdir[1] *= d; rdir[2] *= d;
193 }
194 (*putr)(rorg, rdir);
195 }
196 if (!feof(fp)) {
197 fprintf(stderr, "%s: expected px py on input\n", progname);
198 exit(1);
199 }
200 }
201
202
203 static void
204 putrays(void)
205 {
206 static RREAL loc[2];
207 static FVECT rorg, rdir;
208 float *zbuf = NULL;
209 int sc;
210 double d;
211 register int si, i;
212
213 if (zfd >= 0) {
214 zbuf = (float *)malloc(scanlen(&rs)*sizeof(float));
215 if (zbuf == NULL) {
216 fprintf(stderr, "%s: not enough memory\n", progname);
217 exit(1);
218 }
219 }
220 for (sc = 0; sc < numscans(&rs); sc++) {
221 if (zfd >= 0) {
222 if (read(zfd, zbuf, scanlen(&rs)*sizeof(float)) <
223 scanlen(&rs)*sizeof(float)) {
224 fprintf(stderr, "%s: depth buffer read error\n",
225 progname);
226 exit(1);
227 }
228 }
229 for (si = 0; si < scanlen(&rs); si++) {
230 pix2loc(loc, &rs, si, sc);
231 d = viewray(rorg, rdir, &vw, loc[0], loc[1]);
232 if (d < -FTINY)
233 rorg[0] = rorg[1] = rorg[2] =
234 rdir[0] = rdir[1] = rdir[2] = 0.;
235 else if (zfd >= 0)
236 for (i = 0; i < 3; i++) {
237 rorg[i] += rdir[i]*zbuf[si];
238 rdir[i] = -rdir[i];
239 }
240 else if (d > FTINY) {
241 rdir[0] *= d; rdir[1] *= d; rdir[2] *= d;
242 }
243 (*putr)(rorg, rdir);
244 }
245 }
246 if (zfd >= 0)
247 free((void *)zbuf);
248 }
249
250
251 static void
252 puta( /* put out ray in ASCII format */
253 FVECT ro,
254 FVECT rd
255 )
256 {
257 printf("%.5e %.5e %.5e %.5e %.5e %.5e\n",
258 ro[0], ro[1], ro[2],
259 rd[0], rd[1], rd[2]);
260 }
261
262
263 static void
264 putf( /* put out ray in float format */
265 FVECT ro,
266 FVECT rd
267 )
268 {
269 float v[6];
270
271 v[0] = ro[0]; v[1] = ro[1]; v[2] = ro[2];
272 v[3] = rd[0]; v[4] = rd[1]; v[5] = rd[2];
273 fwrite(v, sizeof(float), 6, stdout);
274 }
275
276
277 static void
278 putd( /* put out ray in double format */
279 FVECT ro,
280 FVECT rd
281 )
282 {
283 double v[6];
284
285 v[0] = ro[0]; v[1] = ro[1]; v[2] = ro[2];
286 v[3] = rd[0]; v[4] = rd[1]; v[5] = rd[2];
287 fwrite(v, sizeof(double), 6, stdout);
288 }