ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
(Generate patch)

Comparing ray/src/gen/xform.c (file contents):
Revision 1.5 by greg, Wed Jun 7 10:09:07 1989 UTC vs.
Revision 1.15 by greg, Tue Jul 23 15:24:21 1991 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1986 Regents of the University of California */
1 > /* Copyright (c) 1991 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 12 | Line 12 | static char SCCSid[] = "$SunId$ LBL";
12   *     11/6/86          Finally added error checking!
13   */
14  
15 < #include  <stdio.h>
15 > #include  "standard.h"
16  
17   #include  <ctype.h>
18  
19 + #include  "object.h"
20  
21 < typedef struct {
21 <        char  *funame;                  /* function name */
22 <        int  (*funp)();                 /* pointer to function */
23 < }  FUN;
21 > #include  "otypes.h"
22  
23   int  xac;                               /* global xform argument count */
24   char  **xav;                            /* global xform argument pointer */
25   int  xfa;                               /* start of xf arguments */
26  
27 < double  totxform[4][4];                 /* total transformation matrix */
30 < double  totscale;                       /* total scale factor */
27 > XF  tot;                                /* total transformation */
28   int  reverse;                           /* boolean true if scene inverted */
29  
30   int  expand = 0;                        /* boolean true to expand commands */
31  
32 + char  *newmod = NULL;                   /* new modifier for surfaces */
33 +
34   char  *idprefix = NULL;                 /* prefix for object identifiers */
35  
36 < 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 < extern int  m_glow();
44 < extern int  m_spot();
45 < 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();
36 > #define  ALIAS          NUMOTYPE        /* put alias at end of array */
37  
38 < 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 <        { "glow", m_glow },
66 <        { "spotlight", m_spot },
67 <        { "dielectric", m_dielectric },
68 <        { "interface", m_interface },
69 <        { "colortext", text },
70 <        { "brighttext", text },
71 <        { "texfunc", addxform },
72 <        { "texdata", addxform },
73 <        { "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 < };
38 > #define  NUMTYPES       (NUMOTYPE+1)    /* total number of object types */
39  
40 < #define  issurface(t)           ((t)<=9)
40 > FUN  ofun[NUMTYPES] = INIT_OTYPE;       /* default types and actions */
41  
42 < 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;
42 > extern char  *malloc(), *fgetword();
43  
101 #define  MAXSTR         512             /* maximum string length */
102
103 FUNARGS  *getfargs();
104 char  *malloc();
105
44   #define  progname  (xav[0])
45  
46  
# Line 113 | Line 51 | char  *argv[];
51          FILE  *fopen();
52          FILE  *fp;
53          int  a;
54 +                                        /* check for array */
55 +        for (a = 1; a < argc; a++)
56 +                if (!strcmp(argv[a], "-a"))
57 +                        return(doarray(argc, argv, a));
58  
59 <        xav = argv;
59 >        initotypes();
60  
61          for (a = 1; a < argc; a++) {
62                  if (argv[a][0] == '-')
63                          switch (argv[a][1]) {
64 +                        case 'm':
65 +                                if (argv[a][2] || a+1 >= argc)
66 +                                        break;
67 +                                newmod = argv[++a];
68 +                                continue;
69                          case 'n':
70 +                                if (argv[a][2] || a+1 >= argc)
71 +                                        break;
72                                  idprefix = argv[++a];
73                                  continue;
74                          case 'e':
75 +                                if (argv[a][2])
76 +                                        break;
77                                  expand = 1;
78                                  continue;
79                          }
80                  break;
81          }
82  
83 +        xav = argv;
84          xfa = a;
85  
86 <        totscale = 1.0;
135 <        setident4(totxform);
86 >        a += xf(&tot, argc-a, argv+a);
87  
88 <        a += xf(totxform, &totscale, argc-a, argv+a);
88 >        if (reverse = tot.sca < 0.0)
89 >                tot.sca = -tot.sca;
90  
91 <        if (reverse = totscale < 0.0)
92 <                totscale = -totscale;
91 >        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  
97          xac = a;
98 <
99 <        putchar('#');                           /* simple header */
98 >                                        /* simple header */
99 >        putchar('#');
100          for (a = 0; a < xac; a++)
101                  printf(" %s", xav[a]);
102          putchar('\n');
103 <
104 <        if (a == argc)
103 >                                        /* transform input */
104 >        if (xac == argc)
105                  xform("standard input", stdin);
106          else
107 <                for ( ; a < argc; a++) {
107 >                for (a = xac; a < argc; a++) {
108                          if ((fp = fopen(argv[a], "r")) == NULL) {
109                                  fprintf(stderr, "%s: cannot open \"%s\"\n",
110                                                  progname, argv[a]);
# Line 159 | Line 114 | char  *argv[];
114                          fclose(fp);
115                  }
116  
117 <        exit(0);
117 >        return(0);
118   }
119  
120  
121 < xform(name, fin)                        /* transform stream by totxform */
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 > }
159 >
160 >
161 > xform(name, fin)                        /* transform stream by tot.xfm */
162   char  *name;
163   register FILE  *fin;
164   {
# Line 181 | Line 176 | register FILE  *fin;
176                          } while (c != '\n');
177                  } else if (c == '!') {                  /* command */
178                          ungetc(c, fin);
179 <                        if (expand)
185 <                                xfcomm(name, fin);
186 <                        else {
187 <                                putchar('\n');
188 <                                while ((c = getc(fin)) != EOF && c != '\n')
189 <                                        putchar(c);
190 <                                printf(" |");
191 <                                for (c = 0; c < xac; c++)
192 <                                        printf(" %s", xav[c]);
193 <                                putchar('\n');
194 <                        }
179 >                        xfcomm(name, fin);
180                  } else {                                /* object */
181                          ungetc(c, fin);
182                          xfobject(name, fin);
# Line 200 | Line 185 | register FILE  *fin;
185   }
186  
187  
188 < xfcomm(fname, fin)                              /* expand a command */
188 > xfcomm(fname, fin)                      /* transform a command */
189   FILE  *fin;
190   {
191          FILE  *popen();
192 <        char  *fgets();
192 >        char  *fgetline();
193          FILE  *pin;
194          char  buf[512];
195 +        int  i;
196  
197 <        fgets(buf, sizeof(buf), fin);
198 <        if (buf[strlen(buf)-1] == '\n')
199 <                buf[strlen(buf)-1] = '\0';
200 <        if ((pin = popen(buf+1, "r")) == NULL) {
201 <                fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n",
202 <                                progname, fname, buf);
203 <                exit(1);
197 >        fgetline(buf, sizeof(buf), fin);
198 >        if (expand) {
199 >                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 >                }
212 >        } else {
213 >                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 >                putchar('\n');
220          }
219        xform(buf, pin);
220        pclose(pin);
221   }
222  
223  
# Line 225 | Line 225 | xfobject(fname, fin)                           /* transform an object */
225   char  *fname;
226   FILE  *fin;
227   {
228 <        char  stmp[MAXSTR];
228 >        char  typ[16], nam[MAXSTR];
229          int  fn;
230 <        
231 <        fscanf(fin, "%s", stmp);        /* modifier */
232 <        printf("\n%s ", stmp);
233 <        fscanf(fin, "%s", stmp);        /* object type */
234 <        if ((fn = otype(stmp)) < 0) {
230 >                                                /* modifier and type */
231 >        strcpy(typ, "EOF");
232 >        fgetword(nam, sizeof(nam), fin);
233 >        fgetword(typ, sizeof(typ), fin);
234 >        if ((fn = otype(typ)) < 0) {
235                  fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
236 <                                progname, fname, stmp);
236 >                                progname, fname, typ);
237                  exit(1);
238          }
239 <        printf("%s ", stmp);
240 <        fscanf(fin, "%s", stmp);        /* object name */
239 >        printf("\n%s %s ", newmod!=NULL && issurface(fn) ? newmod : nam, typ);
240 >                                                /* object name */
241 >        fgetword(nam, sizeof(nam), fin);
242          if (idprefix != NULL && issurface(fn))
243 <                printf("%s.%s\n", idprefix, stmp);
243 >                printf("%s.%s\n", idprefix, nam);
244          else
245 <                printf("%s\n", stmp);
246 <                                        /* transform arguments */
245 >                printf("%s\n", nam);
246 >                                                /* transform arguments */
247          if ((*ofun[fn].funp)(fin) < 0) {
248                  fprintf(stderr, "%s: (%s): bad %s \"%s\"\n",
249 <                                progname, fname, ofun[fn].funame, stmp);
249 >                                progname, fname, ofun[fn].funame, nam);
250                  exit(1);
251          }
252   }
253  
254  
255 < passargs(fin)                   /* pass on arguments unchanged */
255 > o_default(fin)                  /* pass on arguments unchanged */
256   FILE  *fin;
257   {
258          register int  i;
259 <        register FUNARGS  *fa;
259 >        FUNARGS  fa;
260  
261 <        if ((fa = getfargs(fin)) == NULL)
261 >        if (readfargs(&fa, fin) != 1)
262                  return(-1);
263                                          /* string arguments */
264 <        printf("%d", fa->nsargs);
265 <        for (i = 0; i < fa->nsargs; i++)
266 <                printf(" %s", fa->sarg[i]);
264 >        printf("%d", fa.nsargs);
265 >        for (i = 0; i < fa.nsargs; i++)
266 >                printf(" %s", fa.sarg[i]);
267          printf("\n");
268 + #ifdef  IARGS
269                                          /* integer arguments */
270 <        printf("%d", fa->niargs);
271 <        for (i = 0; i < fa->niargs; i++)
272 <                printf(" %d", fa->iarg[i]);
270 >        printf("%d", fa.niargs);
271 >        for (i = 0; i < fa.niargs; i++)
272 >                printf(" %d", fa.iarg[i]);
273          printf("\n");
274 + #else
275 +        printf("0\n");
276 + #endif
277                                          /* float arguments */
278 <        printf("%d", fa->nfargs);
279 <        for (i = 0; i < fa->nfargs; i++)
280 <                printf(" %18.12g", fa->farg[i]);
278 >        printf("%d", fa.nfargs);
279 >        for (i = 0; i < fa.nfargs; i++)
280 >                printf(" %18.12g", fa.farg[i]);
281          printf("\n");
282 <        freefargs(fa);
282 >        freefargs(&fa);
283          return(0);
284   }
285  
# Line 283 | Line 288 | addxform(fin)                  /* add xf arguments to strings */
288   FILE  *fin;
289   {
290          register int  i;
291 <        register FUNARGS  *fa;
291 >        FUNARGS  fa;
292  
293 <        if ((fa = getfargs(fin)) == NULL)
293 >        if (readfargs(&fa, fin) != 1)
294                  return(-1);
295                                          /* string arguments */
296 <        printf("%d", fa->nsargs + xac-xfa);
297 <        for (i = 0; i < fa->nsargs; i++)
298 <                printf(" %s", fa->sarg[i]);
296 >        printf("%d", fa.nsargs + xac-xfa);
297 >        for (i = 0; i < fa.nsargs; i++)
298 >                printf(" %s", fa.sarg[i]);
299          for (i = xfa; i < xac; i++)     /* add xf arguments */
300                  printf(" %s", xav[i]);
301          printf("\n");
302 + #ifdef  IARGS
303                                          /* integer arguments */
304 <        printf("%d", fa->niargs);
305 <        for (i = 0; i < fa->niargs; i++)
306 <                printf(" %d", fa->iarg[i]);
304 >        printf("%d", fa.niargs);
305 >        for (i = 0; i < fa.niargs; i++)
306 >                printf(" %d", fa.iarg[i]);
307          printf("\n");
308 + #else
309 +        printf("0\n");
310 + #endif
311                                          /* float arguments */
312 <        printf("%d", fa->nfargs);
313 <        for (i = 0; i < fa->nfargs; i++)
314 <                printf(" %18.12g", fa->farg[i]);
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);
316 >        freefargs(&fa);
317          return(0);
318   }
319  
# Line 315 | Line 324 | register char  *ofname;
324   {
325          register int  i;
326  
327 <        for (i = 0; ofun[i].funame != NULL; i++)
327 >        for (i = 0; i < NUMTYPES; i++)
328                  if (!strcmp(ofun[i].funame, ofname))
329                          return(i);
330  
# Line 326 | Line 335 | register char  *ofname;
335   alias(fin)                      /* transfer alias */
336   FILE  *fin;
337   {
338 <        char  alias[MAXSTR];
338 >        char  aliasnm[MAXSTR];
339  
340 <        if (fscanf(fin, "%s", alias) != 1)
340 >        if (fgetword(aliasnm, MAXSTR, fin) == NULL)
341                  return(-1);
342 <        printf("\t%s\n", alias);
342 >        printf("\t%s\n", aliasnm);
343          return(0);
344   }
345  
# Line 338 | Line 347 | FILE  *fin;
347   m_glow(fin)                     /* transform arguments for proximity light */
348   FILE  *fin;
349   {
350 <        register FUNARGS  *fa;
350 >        FUNARGS  fa;
351  
352 <        if ((fa = getfargs(fin)) == NULL)
352 >        if (readfargs(&fa, fin) != 1)
353                  return(-1);
354 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
354 >        if (fa.nsargs != 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 <        printf(" %18.12g\n", fa->farg[3] * totscale);
360 <        freefargs(fa);
358 >                        fa.farg[0], fa.farg[1], fa.farg[2]);
359 >        printf(" %18.12g\n", fa.farg[3] * tot.sca);
360 >        freefargs(&fa);
361          return(0);
362   }
363  
# Line 357 | Line 366 | m_spot(fin)                    /* transform arguments for spotlight */
366   FILE  *fin;
367   {
368          double  v[3];
369 <        register FUNARGS  *fa;
369 >        FUNARGS  fa;
370  
371 <        if ((fa = getfargs(fin)) == NULL)
371 >        if (readfargs(&fa, fin) != 1)
372                  return(-1);
373 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
373 >        if (fa.nsargs != 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 <        multv3(v, fa->farg+4, totxform);
377 >                        fa.farg[0], fa.farg[1], fa.farg[2], fa.farg[3]);
378 >        multv3(v, fa.farg+4, tot.xfm);
379          printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
380 <        freefargs(fa);
380 >        freefargs(&fa);
381          return(0);
382   }
383  
# Line 377 | Line 386 | m_dielectric(fin)              /* transform arguments for dielectr
386   FILE  *fin;
387   {
388          double  pow();
389 <        register FUNARGS  *fa;
389 >        FUNARGS  fa;
390  
391 <        if ((fa = getfargs(fin)) == NULL)
391 >        if (readfargs(&fa, fin) != 1)
392                  return(-1);
393 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 5)
393 >        if (fa.nsargs != 0  || fa.nfargs != 5)
394                  return(-1);
395          printf("0\n0\n5");
396          printf(" %18.12g %18.12g %18.12g",
397 <                pow(fa->farg[0], 1.0/totscale),
398 <                pow(fa->farg[1], 1.0/totscale),
399 <                pow(fa->farg[2], 1.0/totscale));
400 <        printf(" %18.12g %18.12g\n", fa->farg[3], fa->farg[4]);
401 <        freefargs(fa);
397 >                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          return(0);
403   }
404  
# Line 398 | Line 407 | m_interface(fin)               /* transform arguments for interface
407   FILE  *fin;
408   {
409          double  pow();
410 <        register FUNARGS  *fa;
410 >        FUNARGS  fa;
411  
412 <        if ((fa = getfargs(fin)) == NULL)
412 >        if (readfargs(&fa, fin) != 1)
413                  return(-1);
414 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
414 >        if (fa.nsargs != 0  || fa.nfargs != 8)
415                  return(-1);
416          printf("0\n0\n8\n");
417          printf("%18.12g %18.12g %18.12g",
418 <                pow(fa->farg[0], 1.0/totscale),
419 <                pow(fa->farg[1], 1.0/totscale),
420 <                pow(fa->farg[2], 1.0/totscale));
421 <        printf(" %18.12g\n", fa->farg[3]);
418 >                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          printf("%18.12g %18.12g %18.12g",
423 <                pow(fa->farg[4], 1.0/totscale),
424 <                pow(fa->farg[5], 1.0/totscale),
425 <                pow(fa->farg[6], 1.0/totscale));
426 <        printf(" %18.12g\n", fa->farg[7]);
427 <        freefargs(fa);
423 >                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          return(0);
429   }
430  
# Line 425 | Line 434 | FILE  *fin;
434   {
435          int  i;
436          double  v[3];
437 <        register FUNARGS  *fa;
437 >        FUNARGS  fa;
438  
439 <        if ((fa = getfargs(fin)) == NULL)
439 >        if (readfargs(&fa, fin) != 1)
440                  return(-1);
441 <        if (fa->niargs != 0 || (fa->nfargs != 9 &&
433 <                        fa->nfargs != 11 && fa->nfargs != 15))
441 >        if (fa.nfargs != 9 && fa.nfargs != 11 && fa.nfargs != 15)
442                  return(-1);
443                                          /* string arguments */
444 <        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);
444 >        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                                          /* anchor point */
449 <        multp3(v, fa->farg, totxform);
449 >        multp3(v, fa.farg, tot.xfm);
450          printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
451                                          /* right vector */
452 <        multv3(v, fa->farg+3, totxform);
452 >        multv3(v, fa.farg+3, tot.xfm);
453          printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
454                                          /* down vector */
455 <        multv3(v, fa->farg+6, totxform);
455 >        multv3(v, fa.farg+6, tot.xfm);
456          printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
457                                          /* forground and background */
458 <        if (fa->nfargs == 11)
459 <                printf(" %18.12g %18.12g\n", fa->farg[9], fa->farg[10]);
460 <        else if (fa->nfargs == 15) {
458 >        if (fa.nfargs == 11)
459 >                printf(" %18.12g %18.12g\n", fa.farg[9], fa.farg[10]);
460 >        else if (fa.nfargs == 15) {
461                  printf(" %18.12g %18.12g %18.12g\n",
462 <                                fa->farg[9], fa->farg[10], fa->farg[11]);
462 >                                fa.farg[9], fa.farg[10], fa.farg[11]);
463                  printf(" %18.12g %18.12g %18.12g\n",
464 <                                fa->farg[12], fa->farg[13], fa->farg[14]);
464 >                                fa.farg[12], fa.farg[13], fa.farg[14]);
465          }
466 <        freefargs(fa);
466 >        freefargs(&fa);
467          return(0);
468   }
469  
# Line 464 | Line 472 | o_source(fin)                  /* transform source arguments */
472   FILE  *fin;
473   {
474          double  dv[3];
475 <        register FUNARGS  *fa;
475 >        FUNARGS  fa;
476  
477 <        if ((fa = getfargs(fin)) == NULL)
477 >        if (readfargs(&fa, fin) != 1)
478                  return(-1);
479 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
479 >        if (fa.nsargs != 0  || fa.nfargs != 4)
480                  return(-1);
481                                          /* transform direction vector */
482 <        multv3(dv, fa->farg, totxform);
482 >        multv3(dv, fa.farg, tot.xfm);
483                                          /* output */
484          printf("0\n0\n4");
485          printf(" %18.12g %18.12g %18.12g %18.12g\n",
486 <                        dv[0], dv[1], dv[2], fa->farg[3]);
487 <        freefargs(fa);
486 >                        dv[0], dv[1], dv[2], fa.farg[3]);
487 >        freefargs(&fa);
488          return(0);
489   }
490  
# Line 485 | Line 493 | o_sphere(fin)                  /* transform sphere arguments */
493   FILE  *fin;
494   {
495          double  cent[3], rad;
496 <        register FUNARGS  *fa;
496 >        FUNARGS  fa;
497  
498 <        if ((fa = getfargs(fin)) == NULL)
498 >        if (readfargs(&fa, fin) != 1)
499                  return(-1);
500 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
500 >        if (fa.nsargs != 0  || fa.nfargs != 4)
501                  return(-1);
502          
503 <        multp3(cent, fa->farg, totxform);       /* transform center */
503 >        multp3(cent, fa.farg, tot.xfm); /* transform center */
504          
505 <        rad = fa->farg[3] * totscale;           /* scale radius */
505 >        rad = fa.farg[3] * tot.sca;             /* scale radius */
506          
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 <        freefargs(fa);
510 >        freefargs(&fa);
511          return(0);
512   }
513  
# Line 509 | Line 517 | FILE  *fin;
517   {
518          double  p[3];
519          register int  i;
520 <        register FUNARGS  *fa;
520 >        FUNARGS  fa;
521  
522 <        if ((fa = getfargs(fin)) == NULL)
522 >        if (readfargs(&fa, fin) != 1)
523                  return(-1);
524 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs % 3)
524 >        if (fa.nsargs != 0  || fa.nfargs % 3)
525                  return(-1);
526          
527 <        printf("0\n0\n%d\n", fa->nfargs);
527 >        printf("0\n0\n%d\n", fa.nfargs);
528          
529 <        for (i = 0; i < fa->nfargs; i += 3) {
529 >        for (i = 0; i < fa.nfargs; i += 3) {
530                  if (reverse)
531 <                        multp3(p, fa->farg+(fa->nfargs-i-3), totxform);
531 >                        multp3(p, fa.farg+(fa.nfargs-i-3), tot.xfm);
532                  else
533 <                        multp3(p, fa->farg+i, totxform);
533 >                        multp3(p, fa.farg+i, tot.xfm);
534                  printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
535          }
536 <        freefargs(fa);
536 >        freefargs(&fa);
537          return(0);
538   }
539  
# Line 534 | Line 542 | o_cone(fin)                    /* transform cone and cup arguments */
542   FILE  *fin;
543   {
544          double  p0[3], p1[3], r0, r1;
545 <        register FUNARGS  *fa;
545 >        FUNARGS  fa;
546  
547 <        if ((fa = getfargs(fin)) == NULL)
547 >        if (readfargs(&fa, fin) != 1)
548                  return(-1);
549 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
549 >        if (fa.nsargs != 0  || fa.nfargs != 8)
550                  return(-1);
551  
552          printf("0\n0\n8\n");
553  
554 <        multp3(p0, fa->farg, totxform);
555 <        multp3(p1, fa->farg+3, totxform);
556 <        r0 = fa->farg[6] * totscale;
557 <        r1 = fa->farg[7] * totscale;
554 >        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          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 <        freefargs(fa);
562 >        freefargs(&fa);
563          return(0);
564   }
565  
# Line 560 | Line 568 | o_cylinder(fin)                        /* transform cylinder and tube argum
568   FILE  *fin;
569   {
570          double  p0[3], p1[3], rad;
571 <        register FUNARGS  *fa;
571 >        FUNARGS  fa;
572  
573 <        if ((fa = getfargs(fin)) == NULL)
573 >        if (readfargs(&fa, fin) != 1)
574                  return(-1);
575 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
575 >        if (fa.nsargs != 0  || fa.nfargs != 7)
576                  return(-1);
577  
578          printf("0\n0\n7\n");
579  
580 <        multp3(p0, fa->farg, totxform);
581 <        multp3(p1, fa->farg+3, totxform);
582 <        rad = fa->farg[6] * totscale;
580 >        multp3(p0, fa.farg, tot.xfm);
581 >        multp3(p1, fa.farg+3, tot.xfm);
582 >        rad = fa.farg[6] * tot.sca;
583          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 <        freefargs(fa);
586 >        freefargs(&fa);
587          return(0);
588   }
589  
# Line 584 | Line 592 | o_ring(fin)                    /* transform ring arguments */
592   FILE  *fin;
593   {
594          double  p0[3], pd[3], r0, r1;
595 <        register FUNARGS  *fa;
595 >        FUNARGS  fa;
596  
597 <        if ((fa = getfargs(fin)) == NULL)
597 >        if (readfargs(&fa, fin) != 1)
598                  return(-1);
599 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
599 >        if (fa.nsargs != 0  || fa.nfargs != 8)
600                  return(-1);
601  
602          printf("0\n0\n8\n");
603  
604 <        multp3(p0, fa->farg, totxform);
605 <        multv3(pd, fa->farg+3, totxform);
606 <        r0 = fa->farg[6] * totscale;
607 <        r1 = fa->farg[7] * totscale;
604 >        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          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 <        freefargs(fa);
611 >        freefargs(&fa);
612          return(0);
613   }
614  
615  
616 < FUNARGS *
609 < getfargs(fp)            /* get function arguments from stream */
610 < FILE  *fp;
616 > initotypes()                    /* initialize ofun[] array */
617   {
618 <        char  *strcpy();
619 <        char  sbuf[MAXSTR];
620 <        int  n;
621 <        register FUNARGS  *fa;
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 ((fa = (FUNARGS *)malloc((unsigned)sizeof(FUNARGS))) == NULL)
635 <                goto memerr;
636 <        if (fscanf(fp, "%d", &n) != 1 || n < 0)
637 <                return(NULL);
638 <        if (fa->nsargs = n) {
639 <                fa->sarg = (char **)malloc((unsigned)fa->nsargs*sizeof(char *));
640 <                if (fa->sarg == NULL)
641 <                        goto memerr;
642 <                for (i = 0; i < fa->nsargs; i++) {
643 <                        if (fscanf(fp, "%s", sbuf) != 1)
644 <                                return(NULL);
645 <                        if ((fa->sarg[i] = malloc((unsigned)strlen(sbuf)+1)) == NULL)
646 <                                goto memerr;
647 <                        strcpy(fa->sarg[i], sbuf);
648 <                }
649 <        } else
650 <                fa->sarg = NULL;
651 <        if (fscanf(fp, "%d", &n) != 1 || n < 0)
652 <                return(NULL);
653 <        if (fa->niargs = n) {
654 <                fa->iarg = (int *)malloc((unsigned)fa->niargs*sizeof(int));
655 <                if (fa->iarg == NULL)
656 <                        goto memerr;
657 <                for (i = 0; i < fa->niargs; i++)
658 <                        if (fscanf(fp, "%d", &fa->iarg[i]) != 1)
659 <                                return(NULL);
660 <        } else
661 <                fa->iarg = NULL;
646 <        if (fscanf(fp, "%d", &n) != 1 || n < 0)
647 <                return(NULL);
648 <        if (fa->nfargs = n) {
649 <                fa->farg = (double *)malloc((unsigned)fa->nfargs*sizeof(double));
650 <                if (fa->farg == NULL)
651 <                        goto memerr;
652 <                for (i = 0; i < fa->nfargs; i++)
653 <                        if (fscanf(fp, "%lf", &fa->farg[i]) != 1)
654 <                                return(NULL);
655 <        } else
656 <                fa->farg = NULL;
657 <        return(fa);
658 < memerr:
659 <        fprintf(stderr, "%s: out of memory in getfargs\n", progname);
660 <        exit(1);
661 < }
662 <
663 <
664 < freefargs(fa)                   /* free memory associated with fa */
665 < register FUNARGS  *fa;
666 < {
667 <        register int  i;
668 <
669 <        for (i = 0; i < fa->nsargs; i++)
670 <                free(fa->sarg[i]);
671 <        if (fa->nsargs)
672 <                free(fa->sarg);
673 <        if (fa->niargs)
674 <                free(fa->iarg);
675 <        if (fa->nfargs)
676 <                free(fa->farg);
677 <        free(fa);
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   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines