ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.14
Committed: Fri Jul 19 09:43:40 1991 UTC (32 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.13: +122 -202 lines
Log Message:
moved readfargs() and freefargs() 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.14 extern char *malloc();
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     fscanf(fin, "%s %s", nam, typ);
232     if ((fn = otype(typ)) < 0) {
233 greg 1.1 fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
234 greg 1.13 progname, fname, typ);
235 greg 1.1 exit(1);
236     }
237 greg 1.13 printf("\n%s %s ", newmod!=NULL && issurface(fn) ? newmod : nam, typ);
238     /* object name */
239     fscanf(fin, "%s", nam);
240 greg 1.1 if (idprefix != NULL && issurface(fn))
241 greg 1.13 printf("%s.%s\n", idprefix, nam);
242 greg 1.1 else
243 greg 1.13 printf("%s\n", nam);
244     /* transform arguments */
245 greg 1.1 if ((*ofun[fn].funp)(fin) < 0) {
246     fprintf(stderr, "%s: (%s): bad %s \"%s\"\n",
247 greg 1.13 progname, fname, ofun[fn].funame, nam);
248 greg 1.1 exit(1);
249     }
250     }
251    
252    
253 greg 1.11 o_default(fin) /* pass on arguments unchanged */
254 greg 1.1 FILE *fin;
255     {
256     register int i;
257 greg 1.14 FUNARGS fa;
258 greg 1.1
259 greg 1.14 if (readfargs(&fa, fin) <= 0)
260 greg 1.1 return(-1);
261     /* string arguments */
262 greg 1.14 printf("%d", fa.nsargs);
263     for (i = 0; i < fa.nsargs; i++)
264     printf(" %s", fa.sarg[i]);
265 greg 1.1 printf("\n");
266 greg 1.14 #ifdef IARGS
267 greg 1.1 /* integer arguments */
268 greg 1.14 printf("%d", fa.niargs);
269     for (i = 0; i < fa.niargs; i++)
270     printf(" %d", fa.iarg[i]);
271 greg 1.1 printf("\n");
272 greg 1.14 #endif
273 greg 1.1 /* float arguments */
274 greg 1.14 printf("%d", fa.nfargs);
275     for (i = 0; i < fa.nfargs; i++)
276     printf(" %18.12g", fa.farg[i]);
277 greg 1.1 printf("\n");
278 greg 1.14 freefargs(&fa);
279 greg 1.1 return(0);
280     }
281    
282    
283     addxform(fin) /* add xf arguments to strings */
284     FILE *fin;
285     {
286     register int i;
287 greg 1.14 FUNARGS fa;
288 greg 1.1
289 greg 1.14 if (readfargs(&fa, fin) <= 0)
290 greg 1.1 return(-1);
291     /* string arguments */
292 greg 1.14 printf("%d", fa.nsargs + xac-xfa);
293     for (i = 0; i < fa.nsargs; i++)
294     printf(" %s", fa.sarg[i]);
295 greg 1.1 for (i = xfa; i < xac; i++) /* add xf arguments */
296     printf(" %s", xav[i]);
297     printf("\n");
298 greg 1.14 #ifdef IARGS
299 greg 1.1 /* integer arguments */
300 greg 1.14 printf("%d", fa.niargs);
301     for (i = 0; i < fa.niargs; i++)
302     printf(" %d", fa.iarg[i]);
303 greg 1.1 printf("\n");
304 greg 1.14 #endif
305 greg 1.1 /* float arguments */
306 greg 1.14 printf("%d", fa.nfargs);
307     for (i = 0; i < fa.nfargs; i++)
308     printf(" %18.12g", fa.farg[i]);
309 greg 1.1 printf("\n");
310 greg 1.14 freefargs(&fa);
311 greg 1.1 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 greg 1.14 FUNARGS fa;
345 greg 1.5
346 greg 1.14 if (readfargs(&fa, fin) <= 0)
347 greg 1.5 return(-1);
348 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 4)
349 greg 1.5 return(-1);
350     printf("0\n0\n4");
351     printf(" %18.12g %18.12g %18.12g",
352 greg 1.14 fa.farg[0], fa.farg[1], fa.farg[2]);
353     printf(" %18.12g\n", fa.farg[3] * tot.sca);
354     freefargs(&fa);
355 greg 1.5 return(0);
356     }
357    
358    
359     m_spot(fin) /* transform arguments for spotlight */
360     FILE *fin;
361     {
362     double v[3];
363 greg 1.14 FUNARGS fa;
364 greg 1.5
365 greg 1.14 if (readfargs(&fa, fin) <= 0)
366 greg 1.5 return(-1);
367 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 7)
368 greg 1.5 return(-1);
369     printf("0\n0\n7");
370     printf(" %18.12g %18.12g %18.12g %18.12g\n",
371 greg 1.14 fa.farg[0], fa.farg[1], fa.farg[2], fa.farg[3]);
372     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 greg 1.14 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 greg 1.14 FUNARGS fa;
384 greg 1.1
385 greg 1.14 if (readfargs(&fa, fin) <= 0)
386 greg 1.1 return(-1);
387 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 5)
388 greg 1.1 return(-1);
389     printf("0\n0\n5");
390     printf(" %18.12g %18.12g %18.12g",
391 greg 1.14 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     printf(" %18.12g %18.12g\n", fa.farg[3], fa.farg[4]);
395     freefargs(&fa);
396 greg 1.1 return(0);
397     }
398    
399    
400     m_interface(fin) /* transform arguments for interface */
401     FILE *fin;
402     {
403     double pow();
404 greg 1.14 FUNARGS fa;
405 greg 1.1
406 greg 1.14 if (readfargs(&fa, fin) <= 0)
407 greg 1.1 return(-1);
408 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 8)
409 greg 1.1 return(-1);
410     printf("0\n0\n8\n");
411     printf("%18.12g %18.12g %18.12g",
412 greg 1.14 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     printf(" %18.12g\n", fa.farg[3]);
416 greg 1.1 printf("%18.12g %18.12g %18.12g",
417 greg 1.14 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     printf(" %18.12g\n", fa.farg[7]);
421     freefargs(&fa);
422 greg 1.1 return(0);
423     }
424    
425    
426     text(fin) /* transform text arguments */
427     FILE *fin;
428     {
429     int i;
430     double v[3];
431 greg 1.14 FUNARGS fa;
432 greg 1.1
433 greg 1.14 if (readfargs(&fa, fin) <= 0)
434 greg 1.1 return(-1);
435 greg 1.14 if (fa.nfargs != 9 && fa.nfargs != 11 && fa.nfargs != 15)
436 greg 1.1 return(-1);
437     /* string arguments */
438 greg 1.14 printf("%d", fa.nsargs);
439     for (i = 0; i < fa.nsargs; i++)
440     printf(" %s", fa.sarg[i]);
441     printf("\n0\n%d\n", fa.nfargs);
442 greg 1.1 /* anchor point */
443 greg 1.14 multp3(v, fa.farg, tot.xfm);
444 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
445     /* right vector */
446 greg 1.14 multv3(v, fa.farg+3, tot.xfm);
447 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
448     /* down vector */
449 greg 1.14 multv3(v, fa.farg+6, tot.xfm);
450 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
451     /* forground and background */
452 greg 1.14 if (fa.nfargs == 11)
453     printf(" %18.12g %18.12g\n", fa.farg[9], fa.farg[10]);
454     else if (fa.nfargs == 15) {
455 greg 1.1 printf(" %18.12g %18.12g %18.12g\n",
456 greg 1.14 fa.farg[9], fa.farg[10], fa.farg[11]);
457 greg 1.1 printf(" %18.12g %18.12g %18.12g\n",
458 greg 1.14 fa.farg[12], fa.farg[13], fa.farg[14]);
459 greg 1.1 }
460 greg 1.14 freefargs(&fa);
461 greg 1.1 return(0);
462     }
463    
464    
465     o_source(fin) /* transform source arguments */
466     FILE *fin;
467     {
468     double dv[3];
469 greg 1.14 FUNARGS fa;
470 greg 1.1
471 greg 1.14 if (readfargs(&fa, fin) <= 0)
472 greg 1.1 return(-1);
473 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 4)
474 greg 1.1 return(-1);
475     /* transform direction vector */
476 greg 1.14 multv3(dv, fa.farg, tot.xfm);
477 greg 1.1 /* output */
478     printf("0\n0\n4");
479     printf(" %18.12g %18.12g %18.12g %18.12g\n",
480 greg 1.14 dv[0], dv[1], dv[2], fa.farg[3]);
481     freefargs(&fa);
482 greg 1.1 return(0);
483     }
484    
485    
486     o_sphere(fin) /* transform sphere arguments */
487     FILE *fin;
488     {
489     double cent[3], rad;
490 greg 1.14 FUNARGS fa;
491 greg 1.1
492 greg 1.14 if (readfargs(&fa, fin) <= 0)
493 greg 1.1 return(-1);
494 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 4)
495 greg 1.1 return(-1);
496    
497 greg 1.14 multp3(cent, fa.farg, tot.xfm); /* transform center */
498 greg 1.1
499 greg 1.14 rad = fa.farg[3] * tot.sca; /* scale radius */
500 greg 1.1
501     printf("0\n0\n4");
502     printf(" %18.12g %18.12g %18.12g %18.12g\n",
503     cent[0], cent[1], cent[2], rad);
504 greg 1.14 freefargs(&fa);
505 greg 1.1 return(0);
506     }
507    
508    
509     o_face(fin) /* transform face arguments */
510     FILE *fin;
511     {
512     double p[3];
513     register int i;
514 greg 1.14 FUNARGS fa;
515 greg 1.1
516 greg 1.14 if (readfargs(&fa, fin) <= 0)
517 greg 1.1 return(-1);
518 greg 1.14 if (fa.nsargs != 0 || fa.nfargs % 3)
519 greg 1.1 return(-1);
520    
521 greg 1.14 printf("0\n0\n%d\n", fa.nfargs);
522 greg 1.1
523 greg 1.14 for (i = 0; i < fa.nfargs; i += 3) {
524 greg 1.1 if (reverse)
525 greg 1.14 multp3(p, fa.farg+(fa.nfargs-i-3), tot.xfm);
526 greg 1.1 else
527 greg 1.14 multp3(p, fa.farg+i, tot.xfm);
528 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
529     }
530 greg 1.14 freefargs(&fa);
531 greg 1.1 return(0);
532     }
533    
534    
535     o_cone(fin) /* transform cone and cup arguments */
536     FILE *fin;
537     {
538     double p0[3], p1[3], r0, r1;
539 greg 1.14 FUNARGS fa;
540 greg 1.1
541 greg 1.14 if (readfargs(&fa, fin) <= 0)
542 greg 1.1 return(-1);
543 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 8)
544 greg 1.1 return(-1);
545    
546     printf("0\n0\n8\n");
547    
548 greg 1.14 multp3(p0, fa.farg, tot.xfm);
549     multp3(p1, fa.farg+3, tot.xfm);
550     r0 = fa.farg[6] * tot.sca;
551     r1 = fa.farg[7] * tot.sca;
552 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
553     printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
554     printf(" %18.12g %18.12g\n", r0, r1);
555    
556 greg 1.14 freefargs(&fa);
557 greg 1.1 return(0);
558     }
559    
560    
561     o_cylinder(fin) /* transform cylinder and tube arguments */
562     FILE *fin;
563     {
564     double p0[3], p1[3], rad;
565 greg 1.14 FUNARGS fa;
566 greg 1.1
567 greg 1.14 if (readfargs(&fa, fin) <= 0)
568 greg 1.1 return(-1);
569 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 7)
570 greg 1.1 return(-1);
571    
572     printf("0\n0\n7\n");
573    
574 greg 1.14 multp3(p0, fa.farg, tot.xfm);
575     multp3(p1, fa.farg+3, tot.xfm);
576     rad = fa.farg[6] * tot.sca;
577 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
578     printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
579     printf(" %18.12g\n", rad);
580 greg 1.14 freefargs(&fa);
581 greg 1.1 return(0);
582     }
583    
584    
585     o_ring(fin) /* transform ring arguments */
586     FILE *fin;
587     {
588     double p0[3], pd[3], r0, r1;
589 greg 1.14 FUNARGS fa;
590 greg 1.1
591 greg 1.14 if (readfargs(&fa, fin) <= 0)
592 greg 1.1 return(-1);
593 greg 1.14 if (fa.nsargs != 0 || fa.nfargs != 8)
594 greg 1.1 return(-1);
595    
596     printf("0\n0\n8\n");
597    
598 greg 1.14 multp3(p0, fa.farg, tot.xfm);
599     multv3(pd, fa.farg+3, tot.xfm);
600     r0 = fa.farg[6] * tot.sca;
601     r1 = fa.farg[7] * tot.sca;
602 greg 1.1 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
603     printf(" %18.12g %18.12g %18.12g\n", pd[0], pd[1], pd[2]);
604     printf(" %18.12g %18.12g\n", r0, r1);
605 greg 1.14 freefargs(&fa);
606 greg 1.1 return(0);
607 greg 1.11 }
608    
609    
610     initotypes() /* initialize ofun[] array */
611     {
612     extern int o_source();
613     extern int o_sphere();
614     extern int o_face();
615     extern int o_cone();
616     extern int o_cylinder();
617     extern int o_ring();
618     extern int m_glow();
619     extern int m_spot();
620     extern int m_dielectric();
621     extern int m_interface();
622     extern int text();
623     extern int alias();
624     extern int passargs();
625     extern int addxform();
626     register int i;
627    
628     if (ofun[OBJ_SOURCE].funp == o_source)
629     return; /* done already */
630     /* alias is additional */
631     ofun[ALIAS].funame = ALIASID;
632     ofun[ALIAS].flags = 0;
633     /* functions get new transform */
634     for (i = 0; i < NUMTYPES; i++)
635     if (hasfunc(i))
636     ofun[i].funp = addxform;
637     /* special cases */
638     ofun[OBJ_SOURCE].funp = o_source;
639     ofun[OBJ_SPHERE].funp =
640     ofun[OBJ_BUBBLE].funp = o_sphere;
641     ofun[OBJ_FACE].funp = o_face;
642     ofun[OBJ_CONE].funp =
643     ofun[OBJ_CUP].funp = o_cone;
644     ofun[OBJ_CYLINDER].funp =
645     ofun[OBJ_TUBE].funp = o_cylinder;
646     ofun[OBJ_RING].funp = o_ring;
647     ofun[OBJ_INSTANCE].funp = addxform;
648     ofun[MAT_GLOW].funp = m_glow;
649     ofun[MAT_SPOT].funp = m_spot;
650     ofun[MAT_DIELECTRIC].funp = m_dielectric;
651     ofun[MAT_INTERFACE].funp = m_interface;
652     ofun[PAT_CTEXT].funp =
653     ofun[PAT_BTEXT].funp =
654     ofun[MIX_TEXT].funp = text;
655     ofun[ALIAS].funp = alias;
656 greg 1.1 }