ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.12
Committed: Sat Dec 15 14:58:03 1990 UTC (33 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.11: +40 -44 lines
Log Message:
added compound matrix type

File Contents

# User Rev Content
1 greg 1.12 /* Copyright (c) 1990 Regents of the University of California */
2 greg 1.1
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 greg 1.12 #include "standard.h"
16 greg 1.1
17     #include <ctype.h>
18    
19 greg 1.11 #include "otypes.h"
20 greg 1.1
21     int xac; /* global xform argument count */
22     char **xav; /* global xform argument pointer */
23     int xfa; /* start of xf arguments */
24    
25 greg 1.12 XF tot; /* total transformation */
26 greg 1.1 int reverse; /* boolean true if scene inverted */
27    
28     int expand = 0; /* boolean true to expand commands */
29    
30     char *idprefix = NULL; /* prefix for object identifiers */
31    
32 greg 1.11 #define ALIAS NUMOTYPE /* put alias at end of array */
33 greg 1.1
34 greg 1.11 #define NUMTYPES (NUMOTYPE+1) /* total number of object types */
35 greg 1.1
36 greg 1.11 FUN ofun[NUMTYPES] = INIT_OTYPE; /* default types and actions */
37 greg 1.1
38     typedef struct {
39     short nsargs; /* # of string arguments */
40     char **sarg; /* string arguments */
41     short niargs; /* # of integer arguments */
42     int *iarg; /* integer arguments */
43     short nfargs; /* # of float arguments */
44     double *farg; /* float arguments */
45     } FUNARGS;
46    
47     #define MAXSTR 512 /* maximum string length */
48    
49     FUNARGS *getfargs();
50     char *malloc();
51    
52     #define progname (xav[0])
53    
54    
55     main(argc, argv) /* get transform options and transform file */
56     int argc;
57     char *argv[];
58     {
59     FILE *fopen();
60     FILE *fp;
61     int a;
62 greg 1.8 /* check for array */
63     for (a = 1; a < argc; a++)
64     if (!strcmp(argv[a], "-a"))
65     return(doarray(argc, argv, a));
66 greg 1.1
67 greg 1.11 initotypes();
68    
69 greg 1.1 for (a = 1; a < argc; a++) {
70     if (argv[a][0] == '-')
71     switch (argv[a][1]) {
72     case 'n':
73 greg 1.9 if (argv[a][2] || a+1 >= argc)
74     break;
75 greg 1.1 idprefix = argv[++a];
76     continue;
77     case 'e':
78 greg 1.9 if (argv[a][2])
79     break;
80 greg 1.1 expand = 1;
81     continue;
82     }
83     break;
84     }
85    
86 greg 1.8 xav = argv;
87 greg 1.1 xfa = a;
88    
89 greg 1.12 a += xf(&tot, argc-a, argv+a);
90 greg 1.1
91 greg 1.12 if (reverse = tot.sca < 0.0)
92     tot.sca = -tot.sca;
93 greg 1.1
94 greg 1.9 if (a < argc && argv[a][0] == '-') {
95     fprintf(stderr, "%s: command line error at '%s'\n",
96     argv[0], argv[a]);
97     exit(1);
98     }
99 greg 1.10
100 greg 1.1 xac = a;
101 greg 1.10 /* simple header */
102     putchar('#');
103 greg 1.1 for (a = 0; a < xac; a++)
104     printf(" %s", xav[a]);
105     putchar('\n');
106 greg 1.10 /* transform input */
107     if (xac == argc)
108 greg 1.1 xform("standard input", stdin);
109     else
110 greg 1.10 for (a = xac; a < argc; a++) {
111 greg 1.1 if ((fp = fopen(argv[a], "r")) == NULL) {
112     fprintf(stderr, "%s: cannot open \"%s\"\n",
113     progname, argv[a]);
114     exit(1);
115     }
116     xform(argv[a], fp);
117     fclose(fp);
118     }
119    
120 greg 1.8 return(0);
121     }
122    
123    
124     doarray(ac, av, ai) /* make array */
125     char **av;
126     int ac, ai;
127     {
128     char *newav[256], **avp;
129     char newid[128], repts[32];
130     char *oldid = NULL;
131     int i, err;
132    
133     avp = newav+2;
134     avp[0] = av[0];
135     for (i = 1; i < ac; i++)
136     if (!strcmp(av[i-1], "-n")) {
137     oldid = av[i];
138     avp[i] = newid;
139     } else
140     avp[i] = av[i];
141     avp[ai] = "-i";
142     avp[ai+1] = repts;
143     avp[i] = NULL;
144     if (oldid == NULL) {
145     newav[0] = av[0];
146     newav[1] = "-n";
147     newav[2] = newid;
148     avp = newav;
149     ac += 2;
150     }
151     err = 0;
152     for (i = 0; i < atoi(av[ai+1]); i++) {
153     if (oldid == NULL)
154     sprintf(newid, "a%d", i);
155     else
156     sprintf(newid, "%s.%d", oldid, i);
157     sprintf(repts, "%d", i);
158     err |= main(ac, avp);
159     }
160     return(err);
161 greg 1.1 }
162    
163    
164 greg 1.12 xform(name, fin) /* transform stream by tot.xfm */
165 greg 1.1 char *name;
166     register FILE *fin;
167     {
168     register int c;
169    
170     while ((c = getc(fin)) != EOF) {
171     if (isspace(c)) /* blank */
172     continue;
173     if (c == '#') { /* comment */
174     putchar(c);
175     do {
176     if ((c = getc(fin)) == EOF)
177     return;
178     putchar(c);
179     } while (c != '\n');
180     } else if (c == '!') { /* command */
181     ungetc(c, fin);
182 greg 1.7 xfcomm(name, fin);
183 greg 1.1 } else { /* object */
184     ungetc(c, fin);
185     xfobject(name, fin);
186     }
187     }
188     }
189    
190    
191 greg 1.7 xfcomm(fname, fin) /* transform a command */
192 greg 1.1 FILE *fin;
193     {
194     FILE *popen();
195 greg 1.7 char *fgetline();
196 greg 1.1 FILE *pin;
197     char buf[512];
198 greg 1.7 int i;
199 greg 1.1
200 greg 1.7 fgetline(buf, sizeof(buf), fin);
201     if (expand) {
202 greg 1.10 if (xac > 2) {
203     if ((pin = popen(buf+1, "r")) == NULL) {
204     fprintf(stderr,
205     "%s: (%s): cannot execute \"%s\"\n",
206     progname, fname, buf);
207     exit(1);
208     }
209     xform(buf, pin);
210     pclose(pin);
211     } else {
212     fflush(stdout);
213     system(buf+1);
214 greg 1.7 }
215     } else {
216 greg 1.10 printf("\n%s", buf);
217     if (xac > 1) {
218     printf(" | %s -e", xav[0]);
219     for (i = 1; i < xac; i++)
220     printf(" %s", xav[i]);
221     }
222 greg 1.7 putchar('\n');
223 greg 1.1 }
224     }
225    
226    
227     xfobject(fname, fin) /* transform an object */
228     char *fname;
229     FILE *fin;
230     {
231     char stmp[MAXSTR];
232     int fn;
233    
234     fscanf(fin, "%s", stmp); /* modifier */
235     printf("\n%s ", stmp);
236     fscanf(fin, "%s", stmp); /* object type */
237     if ((fn = otype(stmp)) < 0) {
238     fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
239     progname, fname, stmp);
240     exit(1);
241     }
242     printf("%s ", stmp);
243     fscanf(fin, "%s", stmp); /* object name */
244     if (idprefix != NULL && issurface(fn))
245     printf("%s.%s\n", idprefix, stmp);
246     else
247     printf("%s\n", stmp);
248     /* transform arguments */
249     if ((*ofun[fn].funp)(fin) < 0) {
250     fprintf(stderr, "%s: (%s): bad %s \"%s\"\n",
251     progname, fname, ofun[fn].funame, stmp);
252     exit(1);
253     }
254     }
255    
256    
257 greg 1.11 o_default(fin) /* pass on arguments unchanged */
258 greg 1.1 FILE *fin;
259     {
260     register int i;
261     register FUNARGS *fa;
262    
263     if ((fa = getfargs(fin)) == NULL)
264     return(-1);
265     /* string arguments */
266     printf("%d", fa->nsargs);
267     for (i = 0; i < fa->nsargs; i++)
268     printf(" %s", fa->sarg[i]);
269     printf("\n");
270     /* integer arguments */
271     printf("%d", fa->niargs);
272     for (i = 0; i < fa->niargs; i++)
273     printf(" %d", fa->iarg[i]);
274     printf("\n");
275     /* float arguments */
276     printf("%d", fa->nfargs);
277     for (i = 0; i < fa->nfargs; i++)
278     printf(" %18.12g", fa->farg[i]);
279     printf("\n");
280     freefargs(fa);
281     return(0);
282     }
283    
284    
285     addxform(fin) /* add xf arguments to strings */
286     FILE *fin;
287     {
288     register int i;
289     register FUNARGS *fa;
290    
291     if ((fa = getfargs(fin)) == NULL)
292     return(-1);
293     /* string arguments */
294     printf("%d", fa->nsargs + xac-xfa);
295     for (i = 0; i < fa->nsargs; i++)
296     printf(" %s", fa->sarg[i]);
297     for (i = xfa; i < xac; i++) /* add xf arguments */
298     printf(" %s", xav[i]);
299     printf("\n");
300     /* integer arguments */
301     printf("%d", fa->niargs);
302     for (i = 0; i < fa->niargs; i++)
303     printf(" %d", fa->iarg[i]);
304     printf("\n");
305     /* float arguments */
306     printf("%d", fa->nfargs);
307     for (i = 0; i < fa->nfargs; i++)
308     printf(" %18.12g", fa->farg[i]);
309     printf("\n");
310     freefargs(fa);
311     return(0);
312     }
313    
314    
315     int
316     otype(ofname) /* get object function number from its name */
317     register char *ofname;
318     {
319     register int i;
320    
321 greg 1.11 for (i = 0; i < NUMTYPES; i++)
322 greg 1.1 if (!strcmp(ofun[i].funame, ofname))
323     return(i);
324    
325     return(-1); /* not found */
326     }
327    
328    
329     alias(fin) /* transfer alias */
330     FILE *fin;
331     {
332 greg 1.12 char aliasnm[MAXSTR];
333 greg 1.1
334 greg 1.12 if (fscanf(fin, "%s", aliasnm) != 1)
335 greg 1.1 return(-1);
336 greg 1.12 printf("\t%s\n", aliasnm);
337 greg 1.5 return(0);
338     }
339    
340    
341     m_glow(fin) /* transform arguments for proximity light */
342     FILE *fin;
343     {
344     register FUNARGS *fa;
345    
346     if ((fa = getfargs(fin)) == NULL)
347     return(-1);
348     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
349     return(-1);
350     printf("0\n0\n4");
351     printf(" %18.12g %18.12g %18.12g",
352     fa->farg[0], fa->farg[1], fa->farg[2]);
353 greg 1.12 printf(" %18.12g\n", fa->farg[3] * tot.sca);
354 greg 1.5 freefargs(fa);
355     return(0);
356     }
357    
358    
359     m_spot(fin) /* transform arguments for spotlight */
360     FILE *fin;
361     {
362     double v[3];
363     register FUNARGS *fa;
364    
365     if ((fa = getfargs(fin)) == NULL)
366     return(-1);
367     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
368     return(-1);
369     printf("0\n0\n7");
370     printf(" %18.12g %18.12g %18.12g %18.12g\n",
371     fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]);
372 greg 1.12 multv3(v, fa->farg+4, tot.xfm);
373 greg 1.5 printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
374     freefargs(fa);
375 greg 1.1 return(0);
376     }
377    
378    
379     m_dielectric(fin) /* transform arguments for dielectric */
380     FILE *fin;
381     {
382     double pow();
383     register FUNARGS *fa;
384    
385     if ((fa = getfargs(fin)) == NULL)
386     return(-1);
387     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 5)
388     return(-1);
389     printf("0\n0\n5");
390     printf(" %18.12g %18.12g %18.12g",
391 greg 1.12 pow(fa->farg[0], 1.0/tot.sca),
392     pow(fa->farg[1], 1.0/tot.sca),
393     pow(fa->farg[2], 1.0/tot.sca));
394 greg 1.1 printf(" %18.12g %18.12g\n", fa->farg[3], fa->farg[4]);
395     freefargs(fa);
396     return(0);
397     }
398    
399    
400     m_interface(fin) /* transform arguments for interface */
401     FILE *fin;
402     {
403     double pow();
404     register FUNARGS *fa;
405    
406     if ((fa = getfargs(fin)) == NULL)
407     return(-1);
408     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
409     return(-1);
410     printf("0\n0\n8\n");
411     printf("%18.12g %18.12g %18.12g",
412 greg 1.12 pow(fa->farg[0], 1.0/tot.sca),
413     pow(fa->farg[1], 1.0/tot.sca),
414     pow(fa->farg[2], 1.0/tot.sca));
415 greg 1.1 printf(" %18.12g\n", fa->farg[3]);
416     printf("%18.12g %18.12g %18.12g",
417 greg 1.12 pow(fa->farg[4], 1.0/tot.sca),
418     pow(fa->farg[5], 1.0/tot.sca),
419     pow(fa->farg[6], 1.0/tot.sca));
420 greg 1.1 printf(" %18.12g\n", fa->farg[7]);
421     freefargs(fa);
422     return(0);
423     }
424    
425    
426     text(fin) /* transform text arguments */
427     FILE *fin;
428     {
429     int i;
430     double v[3];
431     register FUNARGS *fa;
432    
433     if ((fa = getfargs(fin)) == NULL)
434     return(-1);
435     if (fa->niargs != 0 || (fa->nfargs != 9 &&
436     fa->nfargs != 11 && fa->nfargs != 15))
437     return(-1);
438     /* string arguments */
439     printf("%d", fa->nsargs);
440     for (i = 0; i < fa->nsargs; i++)
441     printf(" %s", fa->sarg[i]);
442     printf("\n0\n%d\n", fa->nfargs);
443     /* anchor point */
444 greg 1.12 multp3(v, fa->farg, tot.xfm);
445 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
446     /* right vector */
447 greg 1.12 multv3(v, fa->farg+3, tot.xfm);
448 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
449     /* down vector */
450 greg 1.12 multv3(v, fa->farg+6, tot.xfm);
451 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
452     /* forground and background */
453     if (fa->nfargs == 11)
454     printf(" %18.12g %18.12g\n", fa->farg[9], fa->farg[10]);
455     else if (fa->nfargs == 15) {
456     printf(" %18.12g %18.12g %18.12g\n",
457     fa->farg[9], fa->farg[10], fa->farg[11]);
458     printf(" %18.12g %18.12g %18.12g\n",
459     fa->farg[12], fa->farg[13], fa->farg[14]);
460     }
461     freefargs(fa);
462     return(0);
463     }
464    
465    
466     o_source(fin) /* transform source arguments */
467     FILE *fin;
468     {
469     double dv[3];
470     register FUNARGS *fa;
471    
472     if ((fa = getfargs(fin)) == NULL)
473     return(-1);
474     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
475     return(-1);
476     /* transform direction vector */
477 greg 1.12 multv3(dv, fa->farg, tot.xfm);
478 greg 1.1 /* output */
479     printf("0\n0\n4");
480     printf(" %18.12g %18.12g %18.12g %18.12g\n",
481     dv[0], dv[1], dv[2], fa->farg[3]);
482     freefargs(fa);
483     return(0);
484     }
485    
486    
487     o_sphere(fin) /* transform sphere arguments */
488     FILE *fin;
489     {
490     double cent[3], rad;
491     register FUNARGS *fa;
492    
493     if ((fa = getfargs(fin)) == NULL)
494     return(-1);
495     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
496     return(-1);
497    
498 greg 1.12 multp3(cent, fa->farg, tot.xfm); /* transform center */
499 greg 1.1
500 greg 1.12 rad = fa->farg[3] * tot.sca; /* scale radius */
501 greg 1.1
502     printf("0\n0\n4");
503     printf(" %18.12g %18.12g %18.12g %18.12g\n",
504     cent[0], cent[1], cent[2], rad);
505     freefargs(fa);
506     return(0);
507     }
508    
509    
510     o_face(fin) /* transform face arguments */
511     FILE *fin;
512     {
513     double p[3];
514     register int i;
515     register FUNARGS *fa;
516    
517     if ((fa = getfargs(fin)) == NULL)
518     return(-1);
519     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs % 3)
520     return(-1);
521    
522     printf("0\n0\n%d\n", fa->nfargs);
523    
524     for (i = 0; i < fa->nfargs; i += 3) {
525     if (reverse)
526 greg 1.12 multp3(p, fa->farg+(fa->nfargs-i-3), tot.xfm);
527 greg 1.1 else
528 greg 1.12 multp3(p, fa->farg+i, tot.xfm);
529 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
530     }
531     freefargs(fa);
532     return(0);
533     }
534    
535    
536     o_cone(fin) /* transform cone and cup arguments */
537     FILE *fin;
538     {
539     double p0[3], p1[3], r0, r1;
540     register FUNARGS *fa;
541    
542     if ((fa = getfargs(fin)) == NULL)
543     return(-1);
544     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
545     return(-1);
546    
547     printf("0\n0\n8\n");
548    
549 greg 1.12 multp3(p0, fa->farg, tot.xfm);
550     multp3(p1, fa->farg+3, tot.xfm);
551     r0 = fa->farg[6] * tot.sca;
552     r1 = fa->farg[7] * tot.sca;
553 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
554     printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
555     printf(" %18.12g %18.12g\n", r0, r1);
556    
557     freefargs(fa);
558     return(0);
559     }
560    
561    
562     o_cylinder(fin) /* transform cylinder and tube arguments */
563     FILE *fin;
564     {
565     double p0[3], p1[3], rad;
566     register FUNARGS *fa;
567    
568     if ((fa = getfargs(fin)) == NULL)
569     return(-1);
570     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
571     return(-1);
572    
573     printf("0\n0\n7\n");
574    
575 greg 1.12 multp3(p0, fa->farg, tot.xfm);
576     multp3(p1, fa->farg+3, tot.xfm);
577     rad = fa->farg[6] * tot.sca;
578 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
579     printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
580     printf(" %18.12g\n", rad);
581     freefargs(fa);
582     return(0);
583     }
584    
585    
586     o_ring(fin) /* transform ring arguments */
587     FILE *fin;
588     {
589     double p0[3], pd[3], r0, r1;
590     register FUNARGS *fa;
591    
592     if ((fa = getfargs(fin)) == NULL)
593     return(-1);
594     if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
595     return(-1);
596    
597     printf("0\n0\n8\n");
598    
599 greg 1.12 multp3(p0, fa->farg, tot.xfm);
600     multv3(pd, fa->farg+3, tot.xfm);
601     r0 = fa->farg[6] * tot.sca;
602     r1 = fa->farg[7] * tot.sca;
603 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
604     printf(" %18.12g %18.12g %18.12g\n", pd[0], pd[1], pd[2]);
605     printf(" %18.12g %18.12g\n", r0, r1);
606     freefargs(fa);
607     return(0);
608     }
609    
610    
611     FUNARGS *
612     getfargs(fp) /* get function arguments from stream */
613     FILE *fp;
614     {
615     char *strcpy();
616     char sbuf[MAXSTR];
617     int n;
618     register FUNARGS *fa;
619     register int i;
620    
621     if ((fa = (FUNARGS *)malloc((unsigned)sizeof(FUNARGS))) == NULL)
622     goto memerr;
623     if (fscanf(fp, "%d", &n) != 1 || n < 0)
624     return(NULL);
625     if (fa->nsargs = n) {
626     fa->sarg = (char **)malloc((unsigned)fa->nsargs*sizeof(char *));
627     if (fa->sarg == NULL)
628     goto memerr;
629     for (i = 0; i < fa->nsargs; i++) {
630     if (fscanf(fp, "%s", sbuf) != 1)
631     return(NULL);
632     if ((fa->sarg[i] = malloc((unsigned)strlen(sbuf)+1)) == NULL)
633     goto memerr;
634     strcpy(fa->sarg[i], sbuf);
635     }
636     } else
637     fa->sarg = NULL;
638     if (fscanf(fp, "%d", &n) != 1 || n < 0)
639     return(NULL);
640     if (fa->niargs = n) {
641     fa->iarg = (int *)malloc((unsigned)fa->niargs*sizeof(int));
642     if (fa->iarg == NULL)
643     goto memerr;
644     for (i = 0; i < fa->niargs; i++)
645     if (fscanf(fp, "%d", &fa->iarg[i]) != 1)
646     return(NULL);
647     } else
648     fa->iarg = NULL;
649     if (fscanf(fp, "%d", &n) != 1 || n < 0)
650     return(NULL);
651     if (fa->nfargs = n) {
652     fa->farg = (double *)malloc((unsigned)fa->nfargs*sizeof(double));
653     if (fa->farg == NULL)
654     goto memerr;
655     for (i = 0; i < fa->nfargs; i++)
656     if (fscanf(fp, "%lf", &fa->farg[i]) != 1)
657     return(NULL);
658     } else
659     fa->farg = NULL;
660     return(fa);
661     memerr:
662     fprintf(stderr, "%s: out of memory in getfargs\n", progname);
663     exit(1);
664     }
665    
666    
667     freefargs(fa) /* free memory associated with fa */
668     register FUNARGS *fa;
669     {
670     register int i;
671    
672     for (i = 0; i < fa->nsargs; i++)
673     free(fa->sarg[i]);
674     if (fa->nsargs)
675     free(fa->sarg);
676     if (fa->niargs)
677     free(fa->iarg);
678     if (fa->nfargs)
679     free(fa->farg);
680     free(fa);
681 greg 1.11 }
682    
683    
684     initotypes() /* initialize ofun[] array */
685     {
686     extern int o_source();
687     extern int o_sphere();
688     extern int o_face();
689     extern int o_cone();
690     extern int o_cylinder();
691     extern int o_ring();
692     extern int m_glow();
693     extern int m_spot();
694     extern int m_dielectric();
695     extern int m_interface();
696     extern int text();
697     extern int alias();
698     extern int passargs();
699     extern int addxform();
700     register int i;
701    
702     if (ofun[OBJ_SOURCE].funp == o_source)
703     return; /* done already */
704     /* alias is additional */
705     ofun[ALIAS].funame = ALIASID;
706     ofun[ALIAS].flags = 0;
707     /* functions get new transform */
708     for (i = 0; i < NUMTYPES; i++)
709     if (hasfunc(i))
710     ofun[i].funp = addxform;
711     /* special cases */
712     ofun[OBJ_SOURCE].funp = o_source;
713     ofun[OBJ_SPHERE].funp =
714     ofun[OBJ_BUBBLE].funp = o_sphere;
715     ofun[OBJ_FACE].funp = o_face;
716     ofun[OBJ_CONE].funp =
717     ofun[OBJ_CUP].funp = o_cone;
718     ofun[OBJ_CYLINDER].funp =
719     ofun[OBJ_TUBE].funp = o_cylinder;
720     ofun[OBJ_RING].funp = o_ring;
721     ofun[OBJ_INSTANCE].funp = addxform;
722     ofun[MAT_GLOW].funp = m_glow;
723     ofun[MAT_SPOT].funp = m_spot;
724     ofun[MAT_DIELECTRIC].funp = m_dielectric;
725     ofun[MAT_INTERFACE].funp = m_interface;
726     ofun[PAT_CTEXT].funp =
727     ofun[PAT_BTEXT].funp =
728     ofun[MIX_TEXT].funp = text;
729     ofun[ALIAS].funp = alias;
730 greg 1.1 }