ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.9
Committed: Fri Oct 13 19:34:17 1989 UTC (34 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.8: +9 -0 lines
Log Message:
Improved argument error checking.

File Contents

# Content
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 * xform.c - program to transform object files.
9 * Transformations must preserve aspect ratio.
10 *
11 * 10/19/85
12 * 11/6/86 Finally added error checking!
13 */
14
15 #include <stdio.h>
16
17 #include <ctype.h>
18
19
20 typedef struct {
21 char *funame; /* function name */
22 int (*funp)(); /* pointer to function */
23 } FUN;
24
25 int xac; /* global xform argument count */
26 char **xav; /* global xform argument pointer */
27 int xfa; /* start of xf arguments */
28
29 double totxform[4][4]; /* total transformation matrix */
30 double totscale; /* total scale factor */
31 int reverse; /* boolean true if scene inverted */
32
33 int expand = 0; /* boolean true to expand commands */
34
35 char *idprefix = NULL; /* prefix for object identifiers */
36
37 extern int o_source();
38 extern int o_sphere();
39 extern int o_face();
40 extern int o_cone();
41 extern int o_cylinder();
42 extern int o_ring();
43 extern int m_glow();
44 extern int m_spot();
45 extern int m_dielectric();
46 extern int m_interface();
47 extern int text();
48 extern int alias();
49 extern int passargs();
50 extern int addxform();
51
52 FUN ofun[] = {
53 { "source", o_source },
54 { "sphere", o_sphere },
55 { "bubble", o_sphere },
56 { "polygon", o_face },
57 { "cone", o_cone },
58 { "cup", o_cone },
59 { "cylinder", o_cylinder },
60 { "tube", o_cylinder },
61 { "ring", o_ring },
62 { "instance", addxform },
63 { "alias", alias },
64 { "antimatter", passargs },
65 { "glow", m_glow },
66 { "spotlight", m_spot },
67 { "dielectric", m_dielectric },
68 { "interface", m_interface },
69 { "colortext", text },
70 { "brighttext", text },
71 { "texfunc", addxform },
72 { "texdata", addxform },
73 { "colorfunc", addxform },
74 { "brightfunc", addxform },
75 { "colorpict", addxform },
76 { "colordata", addxform },
77 { "brightdata", addxform },
78 { "mixfunc", addxform },
79 { "mixdata", addxform },
80 { "mixtext", text },
81 { "light", passargs },
82 { "illum", passargs },
83 { "plastic", passargs },
84 { "metal", passargs },
85 { "trans", passargs },
86 { "glass", passargs },
87 { 0 } /* terminator */
88 };
89
90 #define issurface(t) ((t)<=9)
91
92 typedef struct {
93 short nsargs; /* # of string arguments */
94 char **sarg; /* string arguments */
95 short niargs; /* # of integer arguments */
96 int *iarg; /* integer arguments */
97 short nfargs; /* # of float arguments */
98 double *farg; /* float arguments */
99 } FUNARGS;
100
101 #define MAXSTR 512 /* maximum string length */
102
103 FUNARGS *getfargs();
104 char *malloc();
105
106 #define progname (xav[0])
107
108
109 main(argc, argv) /* get transform options and transform file */
110 int argc;
111 char *argv[];
112 {
113 FILE *fopen();
114 FILE *fp;
115 int a;
116 /* check for array */
117 for (a = 1; a < argc; a++)
118 if (!strcmp(argv[a], "-a"))
119 return(doarray(argc, argv, a));
120
121 for (a = 1; a < argc; a++) {
122 if (argv[a][0] == '-')
123 switch (argv[a][1]) {
124 case 'n':
125 if (argv[a][2] || a+1 >= argc)
126 break;
127 idprefix = argv[++a];
128 continue;
129 case 'e':
130 if (argv[a][2])
131 break;
132 expand = 1;
133 continue;
134 }
135 break;
136 }
137
138 xav = argv;
139 xfa = a;
140
141 totscale = 1.0;
142 setident4(totxform);
143
144 a += xf(totxform, &totscale, argc-a, argv+a);
145
146 if (reverse = totscale < 0.0)
147 totscale = -totscale;
148
149 if (a < argc && argv[a][0] == '-') {
150 fprintf(stderr, "%s: command line error at '%s'\n",
151 argv[0], argv[a]);
152 exit(1);
153 }
154 xac = a;
155
156 putchar('#'); /* simple header */
157 for (a = 0; a < xac; a++)
158 printf(" %s", xav[a]);
159 putchar('\n');
160
161 if (a == argc)
162 xform("standard input", stdin);
163 else
164 for ( ; a < argc; a++) {
165 if ((fp = fopen(argv[a], "r")) == NULL) {
166 fprintf(stderr, "%s: cannot open \"%s\"\n",
167 progname, argv[a]);
168 exit(1);
169 }
170 xform(argv[a], fp);
171 fclose(fp);
172 }
173
174 return(0);
175 }
176
177
178 doarray(ac, av, ai) /* make array */
179 char **av;
180 int ac, ai;
181 {
182 char *newav[256], **avp;
183 char newid[128], repts[32];
184 char *oldid = NULL;
185 int i, err;
186
187 avp = newav+2;
188 avp[0] = av[0];
189 for (i = 1; i < ac; i++)
190 if (!strcmp(av[i-1], "-n")) {
191 oldid = av[i];
192 avp[i] = newid;
193 } else
194 avp[i] = av[i];
195 avp[ai] = "-i";
196 avp[ai+1] = repts;
197 avp[i] = NULL;
198 if (oldid == NULL) {
199 newav[0] = av[0];
200 newav[1] = "-n";
201 newav[2] = newid;
202 avp = newav;
203 ac += 2;
204 }
205 err = 0;
206 for (i = 0; i < atoi(av[ai+1]); i++) {
207 if (oldid == NULL)
208 sprintf(newid, "a%d", i);
209 else
210 sprintf(newid, "%s.%d", oldid, i);
211 sprintf(repts, "%d", i);
212 err |= main(ac, avp);
213 }
214 return(err);
215 }
216
217
218 xform(name, fin) /* transform stream by totxform */
219 char *name;
220 register FILE *fin;
221 {
222 register int c;
223
224 while ((c = getc(fin)) != EOF) {
225 if (isspace(c)) /* blank */
226 continue;
227 if (c == '#') { /* comment */
228 putchar(c);
229 do {
230 if ((c = getc(fin)) == EOF)
231 return;
232 putchar(c);
233 } while (c != '\n');
234 } else if (c == '!') { /* command */
235 ungetc(c, fin);
236 xfcomm(name, fin);
237 } else { /* object */
238 ungetc(c, fin);
239 xfobject(name, fin);
240 }
241 }
242 }
243
244
245 xfcomm(fname, fin) /* transform a command */
246 FILE *fin;
247 {
248 FILE *popen();
249 char *fgetline();
250 FILE *pin;
251 char buf[512];
252 int i;
253
254 fgetline(buf, sizeof(buf), fin);
255 if (expand) {
256 if ((pin = popen(buf+1, "r")) == NULL) {
257 fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n",
258 progname, fname, buf);
259 exit(1);
260 }
261 xform(buf, pin);
262 pclose(pin);
263 } else {
264 printf("\n%s | %s -e", buf, xav[0]);
265 for (i = 1; i < xac; i++)
266 printf(" %s", xav[i]);
267 putchar('\n');
268 }
269 }
270
271
272 xfobject(fname, fin) /* transform an object */
273 char *fname;
274 FILE *fin;
275 {
276 char stmp[MAXSTR];
277 int fn;
278
279 fscanf(fin, "%s", stmp); /* modifier */
280 printf("\n%s ", stmp);
281 fscanf(fin, "%s", stmp); /* object type */
282 if ((fn = otype(stmp)) < 0) {
283 fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
284 progname, fname, stmp);
285 exit(1);
286 }
287 printf("%s ", stmp);
288 fscanf(fin, "%s", stmp); /* object name */
289 if (idprefix != NULL && issurface(fn))
290 printf("%s.%s\n", idprefix, stmp);
291 else
292 printf("%s\n", stmp);
293 /* transform arguments */
294 if ((*ofun[fn].funp)(fin) < 0) {
295 fprintf(stderr, "%s: (%s): bad %s \"%s\"\n",
296 progname, fname, ofun[fn].funame, stmp);
297 exit(1);
298 }
299 }
300
301
302 passargs(fin) /* pass on arguments unchanged */
303 FILE *fin;
304 {
305 register int i;
306 register FUNARGS *fa;
307
308 if ((fa = getfargs(fin)) == NULL)
309 return(-1);
310 /* string arguments */
311 printf("%d", fa->nsargs);
312 for (i = 0; i < fa->nsargs; i++)
313 printf(" %s", fa->sarg[i]);
314 printf("\n");
315 /* integer arguments */
316 printf("%d", fa->niargs);
317 for (i = 0; i < fa->niargs; i++)
318 printf(" %d", fa->iarg[i]);
319 printf("\n");
320 /* float arguments */
321 printf("%d", fa->nfargs);
322 for (i = 0; i < fa->nfargs; i++)
323 printf(" %18.12g", fa->farg[i]);
324 printf("\n");
325 freefargs(fa);
326 return(0);
327 }
328
329
330 addxform(fin) /* add xf arguments to strings */
331 FILE *fin;
332 {
333 register int i;
334 register FUNARGS *fa;
335
336 if ((fa = getfargs(fin)) == NULL)
337 return(-1);
338 /* string arguments */
339 printf("%d", fa->nsargs + xac-xfa);
340 for (i = 0; i < fa->nsargs; i++)
341 printf(" %s", fa->sarg[i]);
342 for (i = xfa; i < xac; i++) /* add xf arguments */
343 printf(" %s", xav[i]);
344 printf("\n");
345 /* integer arguments */
346 printf("%d", fa->niargs);
347 for (i = 0; i < fa->niargs; i++)
348 printf(" %d", fa->iarg[i]);
349 printf("\n");
350 /* float arguments */
351 printf("%d", fa->nfargs);
352 for (i = 0; i < fa->nfargs; i++)
353 printf(" %18.12g", fa->farg[i]);
354 printf("\n");
355 freefargs(fa);
356 return(0);
357 }
358
359
360 int
361 otype(ofname) /* get object function number from its name */
362 register char *ofname;
363 {
364 register int i;
365
366 for (i = 0; ofun[i].funame != NULL; i++)
367 if (!strcmp(ofun[i].funame, ofname))
368 return(i);
369
370 return(-1); /* not found */
371 }
372
373
374 alias(fin) /* transfer alias */
375 FILE *fin;
376 {
377 char alias[MAXSTR];
378
379 if (fscanf(fin, "%s", alias) != 1)
380 return(-1);
381 printf("\t%s\n", alias);
382 return(0);
383 }
384
385
386 m_glow(fin) /* transform arguments for proximity light */
387 FILE *fin;
388 {
389 register FUNARGS *fa;
390
391 if ((fa = getfargs(fin)) == NULL)
392 return(-1);
393 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
394 return(-1);
395 printf("0\n0\n4");
396 printf(" %18.12g %18.12g %18.12g",
397 fa->farg[0], fa->farg[1], fa->farg[2]);
398 printf(" %18.12g\n", fa->farg[3] * totscale);
399 freefargs(fa);
400 return(0);
401 }
402
403
404 m_spot(fin) /* transform arguments for spotlight */
405 FILE *fin;
406 {
407 double v[3];
408 register FUNARGS *fa;
409
410 if ((fa = getfargs(fin)) == NULL)
411 return(-1);
412 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
413 return(-1);
414 printf("0\n0\n7");
415 printf(" %18.12g %18.12g %18.12g %18.12g\n",
416 fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]);
417 multv3(v, fa->farg+4, totxform);
418 printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
419 freefargs(fa);
420 return(0);
421 }
422
423
424 m_dielectric(fin) /* transform arguments for dielectric */
425 FILE *fin;
426 {
427 double pow();
428 register FUNARGS *fa;
429
430 if ((fa = getfargs(fin)) == NULL)
431 return(-1);
432 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 5)
433 return(-1);
434 printf("0\n0\n5");
435 printf(" %18.12g %18.12g %18.12g",
436 pow(fa->farg[0], 1.0/totscale),
437 pow(fa->farg[1], 1.0/totscale),
438 pow(fa->farg[2], 1.0/totscale));
439 printf(" %18.12g %18.12g\n", fa->farg[3], fa->farg[4]);
440 freefargs(fa);
441 return(0);
442 }
443
444
445 m_interface(fin) /* transform arguments for interface */
446 FILE *fin;
447 {
448 double pow();
449 register FUNARGS *fa;
450
451 if ((fa = getfargs(fin)) == NULL)
452 return(-1);
453 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
454 return(-1);
455 printf("0\n0\n8\n");
456 printf("%18.12g %18.12g %18.12g",
457 pow(fa->farg[0], 1.0/totscale),
458 pow(fa->farg[1], 1.0/totscale),
459 pow(fa->farg[2], 1.0/totscale));
460 printf(" %18.12g\n", fa->farg[3]);
461 printf("%18.12g %18.12g %18.12g",
462 pow(fa->farg[4], 1.0/totscale),
463 pow(fa->farg[5], 1.0/totscale),
464 pow(fa->farg[6], 1.0/totscale));
465 printf(" %18.12g\n", fa->farg[7]);
466 freefargs(fa);
467 return(0);
468 }
469
470
471 text(fin) /* transform text arguments */
472 FILE *fin;
473 {
474 int i;
475 double v[3];
476 register FUNARGS *fa;
477
478 if ((fa = getfargs(fin)) == NULL)
479 return(-1);
480 if (fa->niargs != 0 || (fa->nfargs != 9 &&
481 fa->nfargs != 11 && fa->nfargs != 15))
482 return(-1);
483 /* string arguments */
484 printf("%d", fa->nsargs);
485 for (i = 0; i < fa->nsargs; i++)
486 printf(" %s", fa->sarg[i]);
487 printf("\n0\n%d\n", fa->nfargs);
488 /* anchor point */
489 multp3(v, fa->farg, totxform);
490 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
491 /* right vector */
492 multv3(v, fa->farg+3, totxform);
493 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
494 /* down vector */
495 multv3(v, fa->farg+6, totxform);
496 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
497 /* forground and background */
498 if (fa->nfargs == 11)
499 printf(" %18.12g %18.12g\n", fa->farg[9], fa->farg[10]);
500 else if (fa->nfargs == 15) {
501 printf(" %18.12g %18.12g %18.12g\n",
502 fa->farg[9], fa->farg[10], fa->farg[11]);
503 printf(" %18.12g %18.12g %18.12g\n",
504 fa->farg[12], fa->farg[13], fa->farg[14]);
505 }
506 freefargs(fa);
507 return(0);
508 }
509
510
511 o_source(fin) /* transform source arguments */
512 FILE *fin;
513 {
514 double dv[3];
515 register FUNARGS *fa;
516
517 if ((fa = getfargs(fin)) == NULL)
518 return(-1);
519 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
520 return(-1);
521 /* transform direction vector */
522 multv3(dv, fa->farg, totxform);
523 /* output */
524 printf("0\n0\n4");
525 printf(" %18.12g %18.12g %18.12g %18.12g\n",
526 dv[0], dv[1], dv[2], fa->farg[3]);
527 freefargs(fa);
528 return(0);
529 }
530
531
532 o_sphere(fin) /* transform sphere arguments */
533 FILE *fin;
534 {
535 double cent[3], rad;
536 register FUNARGS *fa;
537
538 if ((fa = getfargs(fin)) == NULL)
539 return(-1);
540 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
541 return(-1);
542
543 multp3(cent, fa->farg, totxform); /* transform center */
544
545 rad = fa->farg[3] * totscale; /* scale radius */
546
547 printf("0\n0\n4");
548 printf(" %18.12g %18.12g %18.12g %18.12g\n",
549 cent[0], cent[1], cent[2], rad);
550 freefargs(fa);
551 return(0);
552 }
553
554
555 o_face(fin) /* transform face arguments */
556 FILE *fin;
557 {
558 double p[3];
559 register int i;
560 register FUNARGS *fa;
561
562 if ((fa = getfargs(fin)) == NULL)
563 return(-1);
564 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs % 3)
565 return(-1);
566
567 printf("0\n0\n%d\n", fa->nfargs);
568
569 for (i = 0; i < fa->nfargs; i += 3) {
570 if (reverse)
571 multp3(p, fa->farg+(fa->nfargs-i-3), totxform);
572 else
573 multp3(p, fa->farg+i, totxform);
574 printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
575 }
576 freefargs(fa);
577 return(0);
578 }
579
580
581 o_cone(fin) /* transform cone and cup arguments */
582 FILE *fin;
583 {
584 double p0[3], p1[3], r0, r1;
585 register FUNARGS *fa;
586
587 if ((fa = getfargs(fin)) == NULL)
588 return(-1);
589 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
590 return(-1);
591
592 printf("0\n0\n8\n");
593
594 multp3(p0, fa->farg, totxform);
595 multp3(p1, fa->farg+3, totxform);
596 r0 = fa->farg[6] * totscale;
597 r1 = fa->farg[7] * totscale;
598 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
599 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
600 printf(" %18.12g %18.12g\n", r0, r1);
601
602 freefargs(fa);
603 return(0);
604 }
605
606
607 o_cylinder(fin) /* transform cylinder and tube arguments */
608 FILE *fin;
609 {
610 double p0[3], p1[3], rad;
611 register FUNARGS *fa;
612
613 if ((fa = getfargs(fin)) == NULL)
614 return(-1);
615 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
616 return(-1);
617
618 printf("0\n0\n7\n");
619
620 multp3(p0, fa->farg, totxform);
621 multp3(p1, fa->farg+3, totxform);
622 rad = fa->farg[6] * totscale;
623 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
624 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
625 printf(" %18.12g\n", rad);
626 freefargs(fa);
627 return(0);
628 }
629
630
631 o_ring(fin) /* transform ring arguments */
632 FILE *fin;
633 {
634 double p0[3], pd[3], r0, r1;
635 register FUNARGS *fa;
636
637 if ((fa = getfargs(fin)) == NULL)
638 return(-1);
639 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
640 return(-1);
641
642 printf("0\n0\n8\n");
643
644 multp3(p0, fa->farg, totxform);
645 multv3(pd, fa->farg+3, totxform);
646 r0 = fa->farg[6] * totscale;
647 r1 = fa->farg[7] * totscale;
648 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
649 printf(" %18.12g %18.12g %18.12g\n", pd[0], pd[1], pd[2]);
650 printf(" %18.12g %18.12g\n", r0, r1);
651 freefargs(fa);
652 return(0);
653 }
654
655
656 FUNARGS *
657 getfargs(fp) /* get function arguments from stream */
658 FILE *fp;
659 {
660 char *strcpy();
661 char sbuf[MAXSTR];
662 int n;
663 register FUNARGS *fa;
664 register int i;
665
666 if ((fa = (FUNARGS *)malloc((unsigned)sizeof(FUNARGS))) == NULL)
667 goto memerr;
668 if (fscanf(fp, "%d", &n) != 1 || n < 0)
669 return(NULL);
670 if (fa->nsargs = n) {
671 fa->sarg = (char **)malloc((unsigned)fa->nsargs*sizeof(char *));
672 if (fa->sarg == NULL)
673 goto memerr;
674 for (i = 0; i < fa->nsargs; i++) {
675 if (fscanf(fp, "%s", sbuf) != 1)
676 return(NULL);
677 if ((fa->sarg[i] = malloc((unsigned)strlen(sbuf)+1)) == NULL)
678 goto memerr;
679 strcpy(fa->sarg[i], sbuf);
680 }
681 } else
682 fa->sarg = NULL;
683 if (fscanf(fp, "%d", &n) != 1 || n < 0)
684 return(NULL);
685 if (fa->niargs = n) {
686 fa->iarg = (int *)malloc((unsigned)fa->niargs*sizeof(int));
687 if (fa->iarg == NULL)
688 goto memerr;
689 for (i = 0; i < fa->niargs; i++)
690 if (fscanf(fp, "%d", &fa->iarg[i]) != 1)
691 return(NULL);
692 } else
693 fa->iarg = NULL;
694 if (fscanf(fp, "%d", &n) != 1 || n < 0)
695 return(NULL);
696 if (fa->nfargs = n) {
697 fa->farg = (double *)malloc((unsigned)fa->nfargs*sizeof(double));
698 if (fa->farg == NULL)
699 goto memerr;
700 for (i = 0; i < fa->nfargs; i++)
701 if (fscanf(fp, "%lf", &fa->farg[i]) != 1)
702 return(NULL);
703 } else
704 fa->farg = NULL;
705 return(fa);
706 memerr:
707 fprintf(stderr, "%s: out of memory in getfargs\n", progname);
708 exit(1);
709 }
710
711
712 freefargs(fa) /* free memory associated with fa */
713 register FUNARGS *fa;
714 {
715 register int i;
716
717 for (i = 0; i < fa->nsargs; i++)
718 free(fa->sarg[i]);
719 if (fa->nsargs)
720 free(fa->sarg);
721 if (fa->niargs)
722 free(fa->iarg);
723 if (fa->nfargs)
724 free(fa->farg);
725 free(fa);
726 }