ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.6
Committed: Wed Oct 4 13:09:54 1989 UTC (34 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.5: +2 -2 lines
Log Message:
Added exapand option to piped command

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