ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.13
Committed: Mon Feb 18 13:45:09 1991 UTC (33 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.12: +21 -15 lines
Log Message:
added -m option to xform

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