ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/rv2.c
Revision: 2.3
Committed: Thu Dec 19 14:54:55 1991 UTC (32 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.2: +0 -1 lines
Log Message:
removed atof() declarations for NeXT

File Contents

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