ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.15
Committed: Tue Jul 23 15:24:21 1991 UTC (32 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.14: +23 -17 lines
Log Message:
moved readfargs() to library

File Contents

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