ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.8
Committed: Thu Oct 5 09:49:04 1989 UTC (34 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.7: +46 -3 lines
Log Message:
Added array capability.

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