ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.4
Committed: Wed Jun 7 08:40:59 1989 UTC (34 years, 11 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.3: +1 -42 lines
Log Message:
No more spot type, fewer parameters for glow type

File Contents

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