ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.8
Committed: Thu Oct 5 09:49:04 1989 UTC (34 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.7: +46 -3 lines
Log Message:
Added array capability.

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