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