ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.4
Committed: Wed Jun 7 08:40:59 1989 UTC (34 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.3: +1 -42 lines
Log Message:
No more spot type, fewer parameters for glow type

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