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.4 by greg, Wed Jun 7 08:40:59 1989 UTC vs.
Revision 1.10 by greg, Wed Jan 24 09:16:03 1990 UTC

# Line 40 | Line 40 | 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();
# Line 60 | Line 62 | FUN  ofun[] = {
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 },
# Line 76 | Line 80 | FUN  ofun[] = {
80          { "mixtext", text },
81          { "light", passargs },
82          { "illum", passargs },
79        { "glow", passargs },
83          { "plastic", passargs },
84          { "metal", passargs },
85          { "trans", passargs },
# Line 110 | Line 113 | char  *argv[];
113          FILE  *fopen();
114          FILE  *fp;
115          int  a;
116 +                                        /* check for array */
117 +        for (a = 1; a < argc; a++)
118 +                if (!strcmp(argv[a], "-a"))
119 +                        return(doarray(argc, argv, a));
120  
114        xav = argv;
115
121          for (a = 1; a < argc; a++) {
122                  if (argv[a][0] == '-')
123                          switch (argv[a][1]) {
124                          case 'n':
125 +                                if (argv[a][2] || a+1 >= argc)
126 +                                        break;
127                                  idprefix = argv[++a];
128                                  continue;
129                          case 'e':
130 +                                if (argv[a][2])
131 +                                        break;
132                                  expand = 1;
133                                  continue;
134                          }
135                  break;
136          }
137  
138 +        xav = argv;
139          xfa = a;
140  
141          totscale = 1.0;
# Line 136 | Line 146 | char  *argv[];
146          if (reverse = totscale < 0.0)
147                  totscale = -totscale;
148  
149 <        xac = a;
149 >        if (a < argc && argv[a][0] == '-') {
150 >                fprintf(stderr, "%s: command line error at '%s'\n",
151 >                                argv[0], argv[a]);
152 >                exit(1);
153 >        }
154  
155 <        putchar('#');                           /* simple header */
155 >        xac = a;
156 >                                        /* simple header */
157 >        putchar('#');
158          for (a = 0; a < xac; a++)
159                  printf(" %s", xav[a]);
160          putchar('\n');
161 <
162 <        if (a == argc)
161 >                                        /* transform input */
162 >        if (xac == argc)
163                  xform("standard input", stdin);
164          else
165 <                for ( ; a < argc; a++) {
165 >                for (a = xac; a < argc; a++) {
166                          if ((fp = fopen(argv[a], "r")) == NULL) {
167                                  fprintf(stderr, "%s: cannot open \"%s\"\n",
168                                                  progname, argv[a]);
# Line 156 | Line 172 | char  *argv[];
172                          fclose(fp);
173                  }
174  
175 <        exit(0);
175 >        return(0);
176   }
177  
178  
179 + doarray(ac, av, ai)                     /* make array */
180 + char  **av;
181 + int  ac, ai;
182 + {
183 +        char  *newav[256], **avp;
184 +        char  newid[128], repts[32];
185 +        char  *oldid = NULL;
186 +        int  i, err;
187 +        
188 +        avp = newav+2;
189 +        avp[0] = av[0];
190 +        for (i = 1; i < ac; i++)
191 +                if (!strcmp(av[i-1], "-n")) {
192 +                        oldid = av[i];
193 +                        avp[i] = newid;
194 +                } else
195 +                        avp[i] = av[i];
196 +        avp[ai] = "-i";
197 +        avp[ai+1] = repts;
198 +        avp[i] = NULL;
199 +        if (oldid == NULL) {
200 +                newav[0] = av[0];
201 +                newav[1] = "-n";
202 +                newav[2] = newid;
203 +                avp = newav;
204 +                ac += 2;
205 +        }
206 +        err = 0;
207 +        for (i = 0; i < atoi(av[ai+1]); i++) {
208 +                if (oldid == NULL)
209 +                        sprintf(newid, "a%d", i);
210 +                else
211 +                        sprintf(newid, "%s.%d", oldid, i);
212 +                sprintf(repts, "%d", i);
213 +                err |= main(ac, avp);
214 +        }
215 +        return(err);
216 + }
217 +
218 +
219   xform(name, fin)                        /* transform stream by totxform */
220   char  *name;
221   register FILE  *fin;
# Line 178 | Line 234 | register FILE  *fin;
234                          } while (c != '\n');
235                  } else if (c == '!') {                  /* command */
236                          ungetc(c, fin);
237 <                        if (expand)
182 <                                xfcomm(name, fin);
183 <                        else {
184 <                                putchar('\n');
185 <                                while ((c = getc(fin)) != EOF && c != '\n')
186 <                                        putchar(c);
187 <                                printf(" |");
188 <                                for (c = 0; c < xac; c++)
189 <                                        printf(" %s", xav[c]);
190 <                                putchar('\n');
191 <                        }
237 >                        xfcomm(name, fin);
238                  } else {                                /* object */
239                          ungetc(c, fin);
240                          xfobject(name, fin);
# Line 197 | Line 243 | register FILE  *fin;
243   }
244  
245  
246 < xfcomm(fname, fin)                              /* expand a command */
246 > xfcomm(fname, fin)                      /* transform a command */
247   FILE  *fin;
248   {
249          FILE  *popen();
250 <        char  *fgets();
250 >        char  *fgetline();
251          FILE  *pin;
252          char  buf[512];
253 +        int  i;
254  
255 <        fgets(buf, sizeof(buf), fin);
256 <        if (buf[strlen(buf)-1] == '\n')
257 <                buf[strlen(buf)-1] = '\0';
258 <        if ((pin = popen(buf+1, "r")) == NULL) {
259 <                fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n",
260 <                                progname, fname, buf);
261 <                exit(1);
255 >        fgetline(buf, sizeof(buf), fin);
256 >        if (expand) {
257 >                if (xac > 2) {
258 >                        if ((pin = popen(buf+1, "r")) == NULL) {
259 >                                fprintf(stderr,
260 >                                "%s: (%s): cannot execute \"%s\"\n",
261 >                                                progname, fname, buf);
262 >                                exit(1);
263 >                        }
264 >                        xform(buf, pin);
265 >                        pclose(pin);
266 >                } else {
267 >                        fflush(stdout);
268 >                        system(buf+1);
269 >                }
270 >        } else {
271 >                printf("\n%s", buf);
272 >                if (xac > 1) {
273 >                        printf(" | %s -e", xav[0]);
274 >                        for (i = 1; i < xac; i++)
275 >                                printf(" %s", xav[i]);
276 >                }
277 >                putchar('\n');
278          }
216        xform(buf, pin);
217        pclose(pin);
279   }
280  
281  
# Line 328 | Line 389 | FILE  *fin;
389          if (fscanf(fin, "%s", alias) != 1)
390                  return(-1);
391          printf("\t%s\n", alias);
392 +        return(0);
393 + }
394 +
395 +
396 + m_glow(fin)                     /* transform arguments for proximity light */
397 + FILE  *fin;
398 + {
399 +        register FUNARGS  *fa;
400 +
401 +        if ((fa = getfargs(fin)) == NULL)
402 +                return(-1);
403 +        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
404 +                return(-1);
405 +        printf("0\n0\n4");
406 +        printf(" %18.12g %18.12g %18.12g",
407 +                        fa->farg[0], fa->farg[1], fa->farg[2]);
408 +        printf(" %18.12g\n", fa->farg[3] * totscale);
409 +        freefargs(fa);
410 +        return(0);
411 + }
412 +
413 +
414 + m_spot(fin)                     /* transform arguments for spotlight */
415 + FILE  *fin;
416 + {
417 +        double  v[3];
418 +        register FUNARGS  *fa;
419 +
420 +        if ((fa = getfargs(fin)) == NULL)
421 +                return(-1);
422 +        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
423 +                return(-1);
424 +        printf("0\n0\n7");
425 +        printf(" %18.12g %18.12g %18.12g %18.12g\n",
426 +                        fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]);
427 +        multv3(v, fa->farg+4, totxform);
428 +        printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
429 +        freefargs(fa);
430          return(0);
431   }
432  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines