ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.11
Committed: Thu Dec 13 11:51:17 1990 UTC (33 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.10: +57 -59 lines
Log Message:
uses otypes.h for initialization and compatibility

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