ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.13
Committed: Mon Feb 18 13:45:09 1991 UTC (33 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.12: +21 -15 lines
Log Message:
added -m option to xform

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