ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.10
Committed: Wed Jan 24 09:16:03 1990 UTC (34 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.9: +24 -14 lines
Log Message:
eliminated unnecessary processing for xform -e

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
155 xac = a;
156 /* simple header */
157 putchar('#');
158 for (a = 0; a < xac; a++)
159 printf(" %s", xav[a]);
160 putchar('\n');
161 /* transform input */
162 if (xac == argc)
163 xform("standard input", stdin);
164 else
165 for (a = xac; a < argc; a++) {
166 if ((fp = fopen(argv[a], "r")) == NULL) {
167 fprintf(stderr, "%s: cannot open \"%s\"\n",
168 progname, argv[a]);
169 exit(1);
170 }
171 xform(argv[a], fp);
172 fclose(fp);
173 }
174
175 return(0);
176 }
177
178
179 doarray(ac, av, ai) /* make array */
180 char **av;
181 int ac, ai;
182 {
183 char *newav[256], **avp;
184 char newid[128], repts[32];
185 char *oldid = NULL;
186 int i, err;
187
188 avp = newav+2;
189 avp[0] = av[0];
190 for (i = 1; i < ac; i++)
191 if (!strcmp(av[i-1], "-n")) {
192 oldid = av[i];
193 avp[i] = newid;
194 } else
195 avp[i] = av[i];
196 avp[ai] = "-i";
197 avp[ai+1] = repts;
198 avp[i] = NULL;
199 if (oldid == NULL) {
200 newav[0] = av[0];
201 newav[1] = "-n";
202 newav[2] = newid;
203 avp = newav;
204 ac += 2;
205 }
206 err = 0;
207 for (i = 0; i < atoi(av[ai+1]); i++) {
208 if (oldid == NULL)
209 sprintf(newid, "a%d", i);
210 else
211 sprintf(newid, "%s.%d", oldid, i);
212 sprintf(repts, "%d", i);
213 err |= main(ac, avp);
214 }
215 return(err);
216 }
217
218
219 xform(name, fin) /* transform stream by totxform */
220 char *name;
221 register FILE *fin;
222 {
223 register int c;
224
225 while ((c = getc(fin)) != EOF) {
226 if (isspace(c)) /* blank */
227 continue;
228 if (c == '#') { /* comment */
229 putchar(c);
230 do {
231 if ((c = getc(fin)) == EOF)
232 return;
233 putchar(c);
234 } while (c != '\n');
235 } else if (c == '!') { /* command */
236 ungetc(c, fin);
237 xfcomm(name, fin);
238 } else { /* object */
239 ungetc(c, fin);
240 xfobject(name, fin);
241 }
242 }
243 }
244
245
246 xfcomm(fname, fin) /* transform a command */
247 FILE *fin;
248 {
249 FILE *popen();
250 char *fgetline();
251 FILE *pin;
252 char buf[512];
253 int i;
254
255 fgetline(buf, sizeof(buf), fin);
256 if (expand) {
257 if (xac > 2) {
258 if ((pin = popen(buf+1, "r")) == NULL) {
259 fprintf(stderr,
260 "%s: (%s): cannot execute \"%s\"\n",
261 progname, fname, buf);
262 exit(1);
263 }
264 xform(buf, pin);
265 pclose(pin);
266 } else {
267 fflush(stdout);
268 system(buf+1);
269 }
270 } else {
271 printf("\n%s", buf);
272 if (xac > 1) {
273 printf(" | %s -e", xav[0]);
274 for (i = 1; i < xac; i++)
275 printf(" %s", xav[i]);
276 }
277 putchar('\n');
278 }
279 }
280
281
282 xfobject(fname, fin) /* transform an object */
283 char *fname;
284 FILE *fin;
285 {
286 char stmp[MAXSTR];
287 int fn;
288
289 fscanf(fin, "%s", stmp); /* modifier */
290 printf("\n%s ", stmp);
291 fscanf(fin, "%s", stmp); /* object type */
292 if ((fn = otype(stmp)) < 0) {
293 fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
294 progname, fname, stmp);
295 exit(1);
296 }
297 printf("%s ", stmp);
298 fscanf(fin, "%s", stmp); /* object name */
299 if (idprefix != NULL && issurface(fn))
300 printf("%s.%s\n", idprefix, stmp);
301 else
302 printf("%s\n", stmp);
303 /* transform arguments */
304 if ((*ofun[fn].funp)(fin) < 0) {
305 fprintf(stderr, "%s: (%s): bad %s \"%s\"\n",
306 progname, fname, ofun[fn].funame, stmp);
307 exit(1);
308 }
309 }
310
311
312 passargs(fin) /* pass on arguments unchanged */
313 FILE *fin;
314 {
315 register int i;
316 register FUNARGS *fa;
317
318 if ((fa = getfargs(fin)) == NULL)
319 return(-1);
320 /* string arguments */
321 printf("%d", fa->nsargs);
322 for (i = 0; i < fa->nsargs; i++)
323 printf(" %s", fa->sarg[i]);
324 printf("\n");
325 /* integer arguments */
326 printf("%d", fa->niargs);
327 for (i = 0; i < fa->niargs; i++)
328 printf(" %d", fa->iarg[i]);
329 printf("\n");
330 /* float arguments */
331 printf("%d", fa->nfargs);
332 for (i = 0; i < fa->nfargs; i++)
333 printf(" %18.12g", fa->farg[i]);
334 printf("\n");
335 freefargs(fa);
336 return(0);
337 }
338
339
340 addxform(fin) /* add xf arguments to strings */
341 FILE *fin;
342 {
343 register int i;
344 register FUNARGS *fa;
345
346 if ((fa = getfargs(fin)) == NULL)
347 return(-1);
348 /* string arguments */
349 printf("%d", fa->nsargs + xac-xfa);
350 for (i = 0; i < fa->nsargs; i++)
351 printf(" %s", fa->sarg[i]);
352 for (i = xfa; i < xac; i++) /* add xf arguments */
353 printf(" %s", xav[i]);
354 printf("\n");
355 /* integer arguments */
356 printf("%d", fa->niargs);
357 for (i = 0; i < fa->niargs; i++)
358 printf(" %d", fa->iarg[i]);
359 printf("\n");
360 /* float arguments */
361 printf("%d", fa->nfargs);
362 for (i = 0; i < fa->nfargs; i++)
363 printf(" %18.12g", fa->farg[i]);
364 printf("\n");
365 freefargs(fa);
366 return(0);
367 }
368
369
370 int
371 otype(ofname) /* get object function number from its name */
372 register char *ofname;
373 {
374 register int i;
375
376 for (i = 0; ofun[i].funame != NULL; i++)
377 if (!strcmp(ofun[i].funame, ofname))
378 return(i);
379
380 return(-1); /* not found */
381 }
382
383
384 alias(fin) /* transfer alias */
385 FILE *fin;
386 {
387 char alias[MAXSTR];
388
389 if (fscanf(fin, "%s", alias) != 1)
390 return(-1);
391 printf("\t%s\n", alias);
392 return(0);
393 }
394
395
396 m_glow(fin) /* transform arguments for proximity light */
397 FILE *fin;
398 {
399 register FUNARGS *fa;
400
401 if ((fa = getfargs(fin)) == NULL)
402 return(-1);
403 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
404 return(-1);
405 printf("0\n0\n4");
406 printf(" %18.12g %18.12g %18.12g",
407 fa->farg[0], fa->farg[1], fa->farg[2]);
408 printf(" %18.12g\n", fa->farg[3] * totscale);
409 freefargs(fa);
410 return(0);
411 }
412
413
414 m_spot(fin) /* transform arguments for spotlight */
415 FILE *fin;
416 {
417 double v[3];
418 register FUNARGS *fa;
419
420 if ((fa = getfargs(fin)) == NULL)
421 return(-1);
422 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
423 return(-1);
424 printf("0\n0\n7");
425 printf(" %18.12g %18.12g %18.12g %18.12g\n",
426 fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]);
427 multv3(v, fa->farg+4, totxform);
428 printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
429 freefargs(fa);
430 return(0);
431 }
432
433
434 m_dielectric(fin) /* transform arguments for dielectric */
435 FILE *fin;
436 {
437 double pow();
438 register FUNARGS *fa;
439
440 if ((fa = getfargs(fin)) == NULL)
441 return(-1);
442 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 5)
443 return(-1);
444 printf("0\n0\n5");
445 printf(" %18.12g %18.12g %18.12g",
446 pow(fa->farg[0], 1.0/totscale),
447 pow(fa->farg[1], 1.0/totscale),
448 pow(fa->farg[2], 1.0/totscale));
449 printf(" %18.12g %18.12g\n", fa->farg[3], fa->farg[4]);
450 freefargs(fa);
451 return(0);
452 }
453
454
455 m_interface(fin) /* transform arguments for interface */
456 FILE *fin;
457 {
458 double pow();
459 register FUNARGS *fa;
460
461 if ((fa = getfargs(fin)) == NULL)
462 return(-1);
463 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
464 return(-1);
465 printf("0\n0\n8\n");
466 printf("%18.12g %18.12g %18.12g",
467 pow(fa->farg[0], 1.0/totscale),
468 pow(fa->farg[1], 1.0/totscale),
469 pow(fa->farg[2], 1.0/totscale));
470 printf(" %18.12g\n", fa->farg[3]);
471 printf("%18.12g %18.12g %18.12g",
472 pow(fa->farg[4], 1.0/totscale),
473 pow(fa->farg[5], 1.0/totscale),
474 pow(fa->farg[6], 1.0/totscale));
475 printf(" %18.12g\n", fa->farg[7]);
476 freefargs(fa);
477 return(0);
478 }
479
480
481 text(fin) /* transform text arguments */
482 FILE *fin;
483 {
484 int i;
485 double v[3];
486 register FUNARGS *fa;
487
488 if ((fa = getfargs(fin)) == NULL)
489 return(-1);
490 if (fa->niargs != 0 || (fa->nfargs != 9 &&
491 fa->nfargs != 11 && fa->nfargs != 15))
492 return(-1);
493 /* string arguments */
494 printf("%d", fa->nsargs);
495 for (i = 0; i < fa->nsargs; i++)
496 printf(" %s", fa->sarg[i]);
497 printf("\n0\n%d\n", fa->nfargs);
498 /* anchor point */
499 multp3(v, fa->farg, totxform);
500 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
501 /* right vector */
502 multv3(v, fa->farg+3, totxform);
503 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
504 /* down vector */
505 multv3(v, fa->farg+6, totxform);
506 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
507 /* forground and background */
508 if (fa->nfargs == 11)
509 printf(" %18.12g %18.12g\n", fa->farg[9], fa->farg[10]);
510 else if (fa->nfargs == 15) {
511 printf(" %18.12g %18.12g %18.12g\n",
512 fa->farg[9], fa->farg[10], fa->farg[11]);
513 printf(" %18.12g %18.12g %18.12g\n",
514 fa->farg[12], fa->farg[13], fa->farg[14]);
515 }
516 freefargs(fa);
517 return(0);
518 }
519
520
521 o_source(fin) /* transform source arguments */
522 FILE *fin;
523 {
524 double dv[3];
525 register FUNARGS *fa;
526
527 if ((fa = getfargs(fin)) == NULL)
528 return(-1);
529 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
530 return(-1);
531 /* transform direction vector */
532 multv3(dv, fa->farg, totxform);
533 /* output */
534 printf("0\n0\n4");
535 printf(" %18.12g %18.12g %18.12g %18.12g\n",
536 dv[0], dv[1], dv[2], fa->farg[3]);
537 freefargs(fa);
538 return(0);
539 }
540
541
542 o_sphere(fin) /* transform sphere arguments */
543 FILE *fin;
544 {
545 double cent[3], rad;
546 register FUNARGS *fa;
547
548 if ((fa = getfargs(fin)) == NULL)
549 return(-1);
550 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
551 return(-1);
552
553 multp3(cent, fa->farg, totxform); /* transform center */
554
555 rad = fa->farg[3] * totscale; /* scale radius */
556
557 printf("0\n0\n4");
558 printf(" %18.12g %18.12g %18.12g %18.12g\n",
559 cent[0], cent[1], cent[2], rad);
560 freefargs(fa);
561 return(0);
562 }
563
564
565 o_face(fin) /* transform face arguments */
566 FILE *fin;
567 {
568 double p[3];
569 register int i;
570 register FUNARGS *fa;
571
572 if ((fa = getfargs(fin)) == NULL)
573 return(-1);
574 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs % 3)
575 return(-1);
576
577 printf("0\n0\n%d\n", fa->nfargs);
578
579 for (i = 0; i < fa->nfargs; i += 3) {
580 if (reverse)
581 multp3(p, fa->farg+(fa->nfargs-i-3), totxform);
582 else
583 multp3(p, fa->farg+i, totxform);
584 printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
585 }
586 freefargs(fa);
587 return(0);
588 }
589
590
591 o_cone(fin) /* transform cone and cup arguments */
592 FILE *fin;
593 {
594 double p0[3], p1[3], r0, r1;
595 register FUNARGS *fa;
596
597 if ((fa = getfargs(fin)) == NULL)
598 return(-1);
599 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
600 return(-1);
601
602 printf("0\n0\n8\n");
603
604 multp3(p0, fa->farg, totxform);
605 multp3(p1, fa->farg+3, totxform);
606 r0 = fa->farg[6] * totscale;
607 r1 = fa->farg[7] * totscale;
608 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
609 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
610 printf(" %18.12g %18.12g\n", r0, r1);
611
612 freefargs(fa);
613 return(0);
614 }
615
616
617 o_cylinder(fin) /* transform cylinder and tube arguments */
618 FILE *fin;
619 {
620 double p0[3], p1[3], rad;
621 register FUNARGS *fa;
622
623 if ((fa = getfargs(fin)) == NULL)
624 return(-1);
625 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
626 return(-1);
627
628 printf("0\n0\n7\n");
629
630 multp3(p0, fa->farg, totxform);
631 multp3(p1, fa->farg+3, totxform);
632 rad = fa->farg[6] * totscale;
633 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
634 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
635 printf(" %18.12g\n", rad);
636 freefargs(fa);
637 return(0);
638 }
639
640
641 o_ring(fin) /* transform ring arguments */
642 FILE *fin;
643 {
644 double p0[3], pd[3], r0, r1;
645 register FUNARGS *fa;
646
647 if ((fa = getfargs(fin)) == NULL)
648 return(-1);
649 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
650 return(-1);
651
652 printf("0\n0\n8\n");
653
654 multp3(p0, fa->farg, totxform);
655 multv3(pd, fa->farg+3, totxform);
656 r0 = fa->farg[6] * totscale;
657 r1 = fa->farg[7] * totscale;
658 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
659 printf(" %18.12g %18.12g %18.12g\n", pd[0], pd[1], pd[2]);
660 printf(" %18.12g %18.12g\n", r0, r1);
661 freefargs(fa);
662 return(0);
663 }
664
665
666 FUNARGS *
667 getfargs(fp) /* get function arguments from stream */
668 FILE *fp;
669 {
670 char *strcpy();
671 char sbuf[MAXSTR];
672 int n;
673 register FUNARGS *fa;
674 register int i;
675
676 if ((fa = (FUNARGS *)malloc((unsigned)sizeof(FUNARGS))) == NULL)
677 goto memerr;
678 if (fscanf(fp, "%d", &n) != 1 || n < 0)
679 return(NULL);
680 if (fa->nsargs = n) {
681 fa->sarg = (char **)malloc((unsigned)fa->nsargs*sizeof(char *));
682 if (fa->sarg == NULL)
683 goto memerr;
684 for (i = 0; i < fa->nsargs; i++) {
685 if (fscanf(fp, "%s", sbuf) != 1)
686 return(NULL);
687 if ((fa->sarg[i] = malloc((unsigned)strlen(sbuf)+1)) == NULL)
688 goto memerr;
689 strcpy(fa->sarg[i], sbuf);
690 }
691 } else
692 fa->sarg = NULL;
693 if (fscanf(fp, "%d", &n) != 1 || n < 0)
694 return(NULL);
695 if (fa->niargs = n) {
696 fa->iarg = (int *)malloc((unsigned)fa->niargs*sizeof(int));
697 if (fa->iarg == NULL)
698 goto memerr;
699 for (i = 0; i < fa->niargs; i++)
700 if (fscanf(fp, "%d", &fa->iarg[i]) != 1)
701 return(NULL);
702 } else
703 fa->iarg = NULL;
704 if (fscanf(fp, "%d", &n) != 1 || n < 0)
705 return(NULL);
706 if (fa->nfargs = n) {
707 fa->farg = (double *)malloc((unsigned)fa->nfargs*sizeof(double));
708 if (fa->farg == NULL)
709 goto memerr;
710 for (i = 0; i < fa->nfargs; i++)
711 if (fscanf(fp, "%lf", &fa->farg[i]) != 1)
712 return(NULL);
713 } else
714 fa->farg = NULL;
715 return(fa);
716 memerr:
717 fprintf(stderr, "%s: out of memory in getfargs\n", progname);
718 exit(1);
719 }
720
721
722 freefargs(fa) /* free memory associated with fa */
723 register FUNARGS *fa;
724 {
725 register int i;
726
727 for (i = 0; i < fa->nsargs; i++)
728 free(fa->sarg[i]);
729 if (fa->nsargs)
730 free(fa->sarg);
731 if (fa->niargs)
732 free(fa->iarg);
733 if (fa->nfargs)
734 free(fa->farg);
735 free(fa);
736 }