ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/rv2.c
Revision: 1.21
Committed: Sun Oct 14 11:04:56 1990 UTC (33 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.20: +12 -21 lines
Log Message:
added fisheye view types

File Contents

# Content
1 /* Copyright (c) 1987 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * rv2.c - command routines used in tracing a view.
9 *
10 * 3/24/87
11 */
12
13 #include "ray.h"
14
15 #include "octree.h"
16
17 #include "otypes.h"
18
19 #include "rpaint.h"
20
21 #include <ctype.h>
22
23 #define CTRL(c) ('c'-'@')
24
25 extern char *progname;
26
27
28 getframe(s) /* get a new frame */
29 char *s;
30 {
31 if (getrect(s, &pframe) < 0)
32 return;
33 pdepth = 0;
34 }
35
36
37 getrepaint(s) /* get area and repaint */
38 char *s;
39 {
40 RECT box;
41
42 if (getrect(s, &box) < 0)
43 return;
44 paintrect(&ptrunk, 0, 0, hresolu, vresolu, &box);
45 }
46
47
48 getview(s) /* get/show view parameters */
49 char *s;
50 {
51 FILE *fp;
52 char buf[128];
53 char *fname;
54 int change = 0;
55 VIEW nv;
56
57 if (sscanf(s, "%s", buf) == 1) { /* write parameters to a file */
58 if ((fname = getpath(buf, NULL, 0)) == NULL ||
59 (fp = fopen(fname, "a")) == NULL) {
60 sprintf(errmsg, "cannot open \"%s\"", buf);
61 error(COMMAND, errmsg);
62 return;
63 }
64 fputs(progname, fp);
65 fprintview(&ourview, fp);
66 fputs(sskip(s), fp);
67 fputs("\n", fp);
68 fclose(fp);
69 return;
70 }
71 sprintf(buf, "view type (%c): ", ourview.type);
72 (*dev->comout)(buf);
73 (*dev->comin)(buf, NULL);
74 if (buf[0] == CTRL(C)) return;
75 if (buf[0] && buf[0] != ourview.type) {
76 nv.type = buf[0];
77 change++;
78 } else
79 nv.type = ourview.type;
80 sprintf(buf, "view point (%.6g %.6g %.6g): ",
81 ourview.vp[0], ourview.vp[1], ourview.vp[2]);
82 (*dev->comout)(buf);
83 (*dev->comin)(buf, NULL);
84 if (buf[0] == CTRL(C)) return;
85 if (sscanf(buf, "%lf %lf %lf", &nv.vp[0], &nv.vp[1], &nv.vp[2]) == 3)
86 change++;
87 else
88 VCOPY(nv.vp, ourview.vp);
89 sprintf(buf, "view direction (%.6g %.6g %.6g): ",
90 ourview.vdir[0], ourview.vdir[1], ourview.vdir[2]);
91 (*dev->comout)(buf);
92 (*dev->comin)(buf, NULL);
93 if (buf[0] == CTRL(C)) return;
94 if (sscanf(buf,"%lf %lf %lf",&nv.vdir[0],&nv.vdir[1],&nv.vdir[2]) == 3)
95 change++;
96 else
97 VCOPY(nv.vdir, ourview.vdir);
98 sprintf(buf, "view up (%.6g %.6g %.6g): ",
99 ourview.vup[0], ourview.vup[1], ourview.vup[2]);
100 (*dev->comout)(buf);
101 (*dev->comin)(buf, NULL);
102 if (buf[0] == CTRL(C)) return;
103 if (sscanf(buf,"%lf %lf %lf",&nv.vup[0],&nv.vup[1],&nv.vup[2]) == 3)
104 change++;
105 else
106 VCOPY(nv.vup, ourview.vup);
107 sprintf(buf, "view horiz and vert size (%.6g %.6g): ",
108 ourview.horiz, ourview.vert);
109 (*dev->comout)(buf);
110 (*dev->comin)(buf, NULL);
111 if (buf[0] == CTRL(C)) return;
112 if (sscanf(buf, "%lf %lf", &nv.horiz, &nv.vert) == 2)
113 change++;
114 else {
115 nv.horiz = ourview.horiz; nv.vert = ourview.vert;
116 }
117 sprintf(buf, "view shift and lift (%.6g %.6g): ",
118 ourview.hoff, ourview.voff);
119 (*dev->comout)(buf);
120 (*dev->comin)(buf, NULL);
121 if (buf[0] == CTRL(C)) return;
122 if (sscanf(buf, "%lf %lf", &nv.hoff, &nv.voff) == 2)
123 change++;
124 else {
125 nv.hoff = ourview.hoff; nv.voff = ourview.voff;
126 }
127 if (change)
128 newview(&nv);
129 }
130
131
132 lastview(s) /* return to a previous view */
133 char *s;
134 {
135 char buf[128];
136 char *fname;
137 int success;
138 VIEW nv;
139
140 if (sscanf(s, "%s", buf) == 1) { /* get parameters from a file */
141 copystruct(&nv, &stdview);
142 if ((fname = getpath(buf, NULL, 0)) == NULL ||
143 (success = viewfile(fname, &nv, 0, 0)) == -1) {
144 sprintf(errmsg, "cannot open \"%s\"", buf);
145 error(COMMAND, errmsg);
146 return;
147 }
148 if (!success)
149 error(COMMAND, "wrong file format");
150 else
151 newview(&nv);
152 return;
153 }
154 if (oldview.type == 0) { /* no old view! */
155 error(COMMAND, "no previous view");
156 return;
157 }
158 copystruct(&nv, &ourview);
159 copystruct(&ourview, &oldview);
160 copystruct(&oldview, &nv);
161 newimage();
162 }
163
164
165 getaim(s) /* aim camera */
166 char *s;
167 {
168 extern double tan(), atan();
169 double zfact;
170 VIEW nv;
171
172 if (getinterest(s, 1, nv.vdir, &zfact) < 0)
173 return;
174 nv.type = ourview.type;
175 VCOPY(nv.vp, ourview.vp);
176 VCOPY(nv.vup, ourview.vup);
177 nv.hoff = ourview.hoff; nv.voff = ourview.voff;
178 nv.horiz = ourview.horiz; nv.vert = ourview.vert;
179 zoomview(&nv, zfact);
180 newview(&nv);
181 }
182
183
184 getmove(s) /* move camera */
185 char *s;
186 {
187 FVECT vc;
188 double mag;
189
190 if (getinterest(s, 0, vc, &mag) < 0)
191 return;
192 moveview(0.0, 0.0, mag, vc);
193 }
194
195
196 getrotate(s) /* rotate camera */
197 char *s;
198 {
199 extern double normalize(), tan(), atan();
200 VIEW nv;
201 FVECT v1;
202 double angle, elev, zfact;
203
204 elev = 0.0; zfact = 1.0;
205 if (sscanf(s, "%lf %lf %lf", &angle, &elev, &zfact) < 1) {
206 error(COMMAND, "missing angle");
207 return;
208 }
209 nv.type = ourview.type;
210 VCOPY(nv.vp, ourview.vp);
211 VCOPY(nv.vup, ourview.vup);
212 nv.hoff = ourview.hoff; nv.voff = ourview.voff;
213 spinvector(nv.vdir, ourview.vdir, ourview.vup, angle*(PI/180.));
214 if (elev != 0.0) {
215 fcross(v1, nv.vdir, ourview.vup);
216 normalize(v1);
217 spinvector(nv.vdir, nv.vdir, v1, elev*(PI/180.));
218 }
219 nv.horiz = ourview.horiz; nv.vert = ourview.vert;
220 zoomview(&nv, zfact);
221 newview(&nv);
222 }
223
224
225 getpivot(s) /* pivot viewpoint */
226 register char *s;
227 {
228 FVECT vc;
229 double angle, elev, mag;
230
231 elev = 0.0;
232 if (sscanf(s, "%lf %lf", &angle, &elev) < 1) {
233 error(COMMAND, "missing angle");
234 return;
235 }
236 if (getinterest(sskip(sskip(s)), 0, vc, &mag) < 0)
237 return;
238 moveview(angle, elev, mag, vc);
239 }
240
241
242 getexposure(s) /* get new exposure */
243 char *s;
244 {
245 double atof(), pow(), fabs();
246 char buf[128];
247 register char *cp;
248 register PNODE *p;
249 RECT r;
250 int x, y;
251 double e;
252
253 for (cp = s; isspace(*cp); cp++)
254 ;
255 if (*cp == '\0') { /* normalize to point */
256 if (dev->getcur == NULL)
257 return;
258 (*dev->comout)("Pick point for exposure\n");
259 if ((*dev->getcur)(&x, &y) == ABORT)
260 return;
261 r.l = r.d = 0;
262 r.r = hresolu; r.u = vresolu;
263 p = findrect(x, y, &ptrunk, &r, -1);
264 e = 1.0;
265 } else {
266 if (*cp == '=') { /* absolute setting */
267 p = NULL;
268 e = 1.0/exposure;
269 for (cp++; isspace(*cp); cp++)
270 ;
271 if (*cp == '\0') { /* interactive */
272 sprintf(buf, "exposure (%lf): ", exposure);
273 (*dev->comout)(buf);
274 (*dev->comin)(buf, NULL);
275 for (cp = buf; isspace(*cp); cp++)
276 ;
277 if (*cp == '\0')
278 return;
279 }
280 } else { /* normalize to average */
281 p = &ptrunk;
282 e = 1.0;
283 }
284 if (*cp == '+' || *cp == '-') /* f-stops */
285 e *= pow(2.0, atof(cp));
286 else /* multiplier */
287 e *= atof(cp);
288 }
289 if (p != NULL) { /* relative setting */
290 if (bright(p->v) <= FTINY) {
291 error(COMMAND, "cannot normalize to zero");
292 return;
293 }
294 e *= 0.5 / bright(p->v);
295 }
296 if (e <= FTINY || fabs(1.0 - e) <= FTINY)
297 return;
298 scalepict(&ptrunk, e);
299 exposure *= e;
300 redraw();
301 }
302
303
304 setparam(s) /* get/set program parameter */
305 register char *s;
306 {
307 extern int psample;
308 extern double maxdiff;
309 extern double minweight;
310 extern int maxdepth;
311 extern double dstrsrc;
312 extern double shadthresh;
313 extern double shadcert;
314 extern COLOR ambval;
315 extern double ambacc;
316 extern double minarad;
317 extern int ambres;
318 extern int ambdiv;
319 extern int ambssamp;
320 extern int ambounce;
321 int i0;
322 double d0, d1, d2;
323 char buf[128];
324
325 if (s[0] == '\0') {
326 (*dev->comout)("aa ab ad ar as av dc dj dt lr lw sp st: ");
327 (*dev->comin)(buf, NULL);
328 s = buf;
329 }
330 switch (s[0]) {
331 case 'l': /* limit */
332 switch (s[1]) {
333 case 'w': /* weight */
334 if (sscanf(s+2, "%lf", &d0) != 1) {
335 sprintf(buf, "limit weight (%.6g): ",
336 minweight);
337 (*dev->comout)(buf);
338 (*dev->comin)(buf, NULL);
339 if (sscanf(buf, "%lf", &d0) != 1)
340 break;
341 }
342 minweight = d0;
343 break;
344 case 'r': /* reflection */
345 if (sscanf(s+2, "%d", &i0) != 1) {
346 sprintf(buf, "limit reflection (%d): ",
347 maxdepth);
348 (*dev->comout)(buf);
349 (*dev->comin)(buf, NULL);
350 if (sscanf(buf, "%d", &i0) != 1)
351 break;
352 }
353 maxdepth = i0;
354 break;
355 default:
356 goto badparam;
357 }
358 break;
359 case 'd': /* direct */
360 switch (s[1]) {
361 case 'j': /* jitter */
362 if (sscanf(s+2, "%lf", &d0) != 1) {
363 sprintf(buf, "direct jitter (%.6g): ",
364 dstrsrc);
365 (*dev->comout)(buf);
366 (*dev->comin)(buf, NULL);
367 if (sscanf(buf, "%lf", &d0) != 1)
368 break;
369 }
370 dstrsrc = d0;
371 break;
372 case 'c': /* certainty */
373 if (sscanf(s+2, "%lf", &d0) != 1) {
374 sprintf(buf, "direct certainty (%.6g): ",
375 shadcert);
376 (*dev->comout)(buf);
377 (*dev->comin)(buf, NULL);
378 if (sscanf(buf, "%lf", &d0) != 1)
379 break;
380 }
381 shadcert = d0;
382 break;
383 case 't': /* threshold */
384 if (sscanf(s+2, "%lf", &d0) != 1) {
385 sprintf(buf, "direct threshold (%.6g): ",
386 shadthresh);
387 (*dev->comout)(buf);
388 (*dev->comin)(buf, NULL);
389 if (sscanf(buf, "%lf", &d0) != 1)
390 break;
391 }
392 shadthresh = d0;
393 break;
394 default:
395 goto badparam;
396 }
397 break;
398 case 'a': /* ambient */
399 switch (s[1]) {
400 case 'v': /* value */
401 if (sscanf(s+2, "%lf %lf %lf", &d0, &d1, &d2) != 3) {
402 sprintf(buf,
403 "ambient value (%.6g %.6g %.6g): ",
404 colval(ambval,RED),
405 colval(ambval,GRN),
406 colval(ambval,BLU));
407 (*dev->comout)(buf);
408 (*dev->comin)(buf, NULL);
409 if (sscanf(buf, "%lf %lf %lf",
410 &d0, &d1, &d2) != 3)
411 break;
412 }
413 setcolor(ambval, d0, d1, d2);
414 break;
415 case 'a': /* accuracy */
416 if (sscanf(s+2, "%lf", &d0) != 1) {
417 sprintf(buf, "ambient accuracy (%.6g): ",
418 ambacc);
419 (*dev->comout)(buf);
420 (*dev->comin)(buf, NULL);
421 if (sscanf(buf, "%lf", &d0) != 1)
422 break;
423 }
424 ambacc = d0;
425 break;
426 case 'd': /* divisions */
427 if (sscanf(s+2, "%d", &i0) != 1) {
428 sprintf(buf, "ambient divisions (%d): ",
429 ambdiv);
430 (*dev->comout)(buf);
431 (*dev->comin)(buf, NULL);
432 if (sscanf(buf, "%d", &i0) != 1)
433 break;
434 }
435 ambdiv = i0;
436 break;
437 case 's': /* samples */
438 if (sscanf(s+2, "%d", &i0) != 1) {
439 sprintf(buf, "ambient super-samples (%d): ",
440 ambssamp);
441 (*dev->comout)(buf);
442 (*dev->comin)(buf, NULL);
443 if (sscanf(buf, "%d", &i0) != 1)
444 break;
445 }
446 ambssamp = i0;
447 break;
448 case 'b': /* bounces */
449 if (sscanf(s+2, "%d", &i0) != 1) {
450 sprintf(buf, "ambient bounces (%d): ",
451 ambounce);
452 (*dev->comout)(buf);
453 (*dev->comin)(buf, NULL);
454 if (sscanf(buf, "%d", &i0) != 1)
455 break;
456 }
457 ambounce = i0;
458 break;
459 case 'r':
460 if (sscanf(s+2, "%d", &i0) != 1) {
461 sprintf(buf, "ambient resolution (%d): ",
462 ambres);
463 (*dev->comout)(buf);
464 (*dev->comin)(buf, NULL);
465 if (sscanf(buf, "%d", &i0) != 1)
466 break;
467 }
468 ambres = i0;
469 minarad = ambres > 0 ? thescene.cusize/ambres : 0.0;
470 break;
471 default:
472 goto badparam;
473 }
474 break;
475 case 's': /* sample */
476 switch (s[1]) {
477 case 'p': /* pixel */
478 if (sscanf(s+2, "%d", &i0) != 1) {
479 sprintf(buf, "sample pixel (%d): ", psample);
480 (*dev->comout)(buf);
481 (*dev->comin)(buf, NULL);
482 if (sscanf(buf, "%d", &i0) != 1)
483 break;
484 }
485 psample = i0;
486 pdepth = 0;
487 break;
488 case 't': /* threshold */
489 if (sscanf(s+2, "%lf", &d0) != 1) {
490 sprintf(buf, "sample threshold (%.6g): ",
491 maxdiff);
492 (*dev->comout)(buf);
493 (*dev->comin)(buf, NULL);
494 if (sscanf(buf, "%lf", &d0) != 1)
495 break;
496 }
497 maxdiff = d0;
498 pdepth = 0;
499 break;
500 default:
501 goto badparam;
502 }
503 break;
504 case '\0': /* nothing */
505 break;
506 default:;
507 badparam:
508 sprintf(errmsg, "%s: unknown variable", s);
509 error(COMMAND, errmsg);
510 break;
511 }
512 }
513
514
515 traceray(s) /* trace a single ray */
516 char *s;
517 {
518 char buf[128];
519 int x, y;
520 RAY thisray;
521
522 if (sscanf(s, "%lf %lf %lf %lf %lf %lf",
523 &thisray.rorg[0], &thisray.rorg[1], &thisray.rorg[2],
524 &thisray.rdir[0], &thisray.rdir[1], &thisray.rdir[2]) != 6) {
525
526 if (dev->getcur == NULL)
527 return;
528 (*dev->comout)("Pick ray\n");
529 if ((*dev->getcur)(&x, &y) == ABORT)
530 return;
531
532 if (viewray(thisray.rorg, thisray.rdir, &ourview,
533 (x+.5)/hresolu, (y+.5)/vresolu) < 0) {
534 error(COMMAND, "not on image");
535 return;
536 }
537
538 } else if (normalize(thisray.rdir) == 0.0) {
539 error(COMMAND, "zero ray direction");
540 return;
541 }
542
543 rayorigin(&thisray, NULL, PRIMARY, 1.0);
544
545 rayvalue(&thisray);
546
547 if (thisray.ro == NULL)
548 (*dev->comout)("ray hit nothing");
549 else {
550 sprintf(buf, "ray hit %s %s \"%s\"",
551 objptr(thisray.ro->omod)->oname,
552 ofun[thisray.ro->otype].funame,
553 thisray.ro->oname);
554 (*dev->comout)(buf);
555 (*dev->comin)(buf, NULL);
556 if (thisray.rot >= FHUGE)
557 (*dev->comout)("at infinity");
558 else {
559 sprintf(buf, "at (%.6g %.6g %.6g)", thisray.rop[0],
560 thisray.rop[1], thisray.rop[2]);
561 (*dev->comout)(buf);
562 }
563 (*dev->comin)(buf, NULL);
564 sprintf(buf, "with value (%.6g %.6g %.6g)",
565 colval(thisray.rcol,RED),
566 colval(thisray.rcol,GRN),
567 colval(thisray.rcol,BLU));
568 (*dev->comout)(buf);
569 }
570 (*dev->comin)(buf, NULL);
571 }
572
573
574 writepict(s) /* write the picture to a file */
575 char *s;
576 {
577 static char buf[128];
578 char *fname;
579 FILE *fp;
580 COLR *scanline;
581 int y;
582
583 if (sscanf(s, "%s", buf) != 1 && buf[0] == '\0') {
584 error(COMMAND, "no file");
585 return;
586 }
587 if ((fname = getpath(buf, NULL, 0)) == NULL ||
588 (fp = fopen(fname, "w")) == NULL) {
589 sprintf(errmsg, "cannot open \"%s\"", buf);
590 error(COMMAND, errmsg);
591 return;
592 }
593 (*dev->comout)("writing \"");
594 (*dev->comout)(fname);
595 (*dev->comout)("\"...\n");
596 /* write header */
597 fputs(progname, fp);
598 fprintview(&ourview, fp);
599 putc('\n', fp);
600 if (exposure != 1.0)
601 fputexpos(exposure, fp);
602 if (dev->pixaspect != 1.0)
603 fputaspect(dev->pixaspect, fp);
604 putc('\n', fp);
605 fputresolu(YMAJOR|YDECR, hresolu, vresolu, fp);
606
607 scanline = (COLR *)malloc(hresolu*sizeof(COLR));
608 if (scanline == NULL)
609 error(SYSTEM, "out of memory in writepict");
610 for (y = vresolu-1; y >= 0; y--) {
611 getpictcolrs(y, scanline, &ptrunk, hresolu, vresolu);
612 if (fwritecolrs(scanline, hresolu, fp) < 0)
613 break;
614 }
615 if (fclose(fp) < 0)
616 error(COMMAND, "write error");
617 free((char *)scanline);
618 }