ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.12
Committed: Sat Dec 15 14:58:03 1990 UTC (33 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.11: +40 -44 lines
Log Message:
added compound matrix type

File Contents

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