ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.7
Committed: Wed Oct 4 16:28:14 1989 UTC (34 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.6: +18 -22 lines
Log Message:
Added multi-line commands.

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