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

# User Rev Content
1 greg 1.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 greg 1.5 extern int m_glow();
44     extern int m_spot();
45 greg 1.1 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 greg 1.5 { "glow", m_glow },
66     { "spotlight", m_spot },
67 greg 1.1 { "dielectric", m_dielectric },
68     { "interface", m_interface },
69     { "colortext", text },
70     { "brighttext", text },
71     { "texfunc", addxform },
72 greg 1.2 { "texdata", addxform },
73 greg 1.1 { "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 greg 1.8 /* check for array */
117     for (a = 1; a < argc; a++)
118     if (!strcmp(argv[a], "-a"))
119     return(doarray(argc, argv, a));
120 greg 1.1
121     for (a = 1; a < argc; a++) {
122     if (argv[a][0] == '-')
123     switch (argv[a][1]) {
124     case 'n':
125 greg 1.9 if (argv[a][2] || a+1 >= argc)
126     break;
127 greg 1.1 idprefix = argv[++a];
128     continue;
129     case 'e':
130 greg 1.9 if (argv[a][2])
131     break;
132 greg 1.1 expand = 1;
133     continue;
134     }
135     break;
136     }
137    
138 greg 1.8 xav = argv;
139 greg 1.1 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 greg 1.9 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 greg 1.10
155 greg 1.1 xac = a;
156 greg 1.10 /* simple header */
157     putchar('#');
158 greg 1.1 for (a = 0; a < xac; a++)
159     printf(" %s", xav[a]);
160     putchar('\n');
161 greg 1.10 /* transform input */
162     if (xac == argc)
163 greg 1.1 xform("standard input", stdin);
164     else
165 greg 1.10 for (a = xac; a < argc; a++) {
166 greg 1.1 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 greg 1.8 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 greg 1.1 }
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 greg 1.7 xfcomm(name, fin);
238 greg 1.1 } else { /* object */
239     ungetc(c, fin);
240     xfobject(name, fin);
241     }
242     }
243     }
244    
245    
246 greg 1.7 xfcomm(fname, fin) /* transform a command */
247 greg 1.1 FILE *fin;
248     {
249     FILE *popen();
250 greg 1.7 char *fgetline();
251 greg 1.1 FILE *pin;
252     char buf[512];
253 greg 1.7 int i;
254 greg 1.1
255 greg 1.7 fgetline(buf, sizeof(buf), fin);
256     if (expand) {
257 greg 1.10 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 greg 1.7 }
270     } else {
271 greg 1.10 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 greg 1.7 putchar('\n');
278 greg 1.1 }
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 greg 1.5 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 greg 1.1 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     }