ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.9
Committed: Fri Oct 13 19:34:17 1989 UTC (34 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.8: +9 -0 lines
Log Message:
Improved argument error checking.

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