ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.2
Committed: Tue Mar 14 11:36:59 1989 UTC (35 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.1: +1 -0 lines
Log Message:
added texdata 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_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();
51
52 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 };
89
90 #define issurface(t) ((t)<=9)
91
92 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;
100
101 #define MAXSTR 512 /* maximum string length */
102
103 FUNARGS *getfargs();
104 char *malloc();
105
106 #define progname (xav[0])
107
108
109 main(argc, argv) /* get transform options and transform file */
110 int argc;
111 char *argv[];
112 {
113 FILE *fopen();
114 FILE *fp;
115 int a;
116
117 xav = argv;
118
119 for (a = 1; a < argc; a++) {
120 if (argv[a][0] == '-')
121 switch (argv[a][1]) {
122 case 'n':
123 idprefix = argv[++a];
124 continue;
125 case 'e':
126 expand = 1;
127 continue;
128 }
129 break;
130 }
131
132 xfa = a;
133
134 totscale = 1.0;
135 setident4(totxform);
136
137 a += xf(totxform, &totscale, argc-a, argv+a);
138
139 if (reverse = totscale < 0.0)
140 totscale = -totscale;
141
142 xac = a;
143
144 putchar('#'); /* simple header */
145 for (a = 0; a < xac; a++)
146 printf(" %s", xav[a]);
147 putchar('\n');
148
149 if (a == argc)
150 xform("standard input", stdin);
151 else
152 for ( ; a < argc; a++) {
153 if ((fp = fopen(argv[a], "r")) == NULL) {
154 fprintf(stderr, "%s: cannot open \"%s\"\n",
155 progname, argv[a]);
156 exit(1);
157 }
158 xform(argv[a], fp);
159 fclose(fp);
160 }
161
162 exit(0);
163 }
164
165
166 xform(name, fin) /* transform stream by totxform */
167 char *name;
168 register FILE *fin;
169 {
170 register int c;
171
172 while ((c = getc(fin)) != EOF) {
173 if (isspace(c)) /* blank */
174 continue;
175 if (c == '#') { /* comment */
176 putchar(c);
177 do {
178 if ((c = getc(fin)) == EOF)
179 return;
180 putchar(c);
181 } while (c != '\n');
182 } else if (c == '!') { /* command */
183 ungetc(c, fin);
184 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 }
195 } else { /* object */
196 ungetc(c, fin);
197 xfobject(name, fin);
198 }
199 }
200 }
201
202
203 xfcomm(fname, fin) /* expand a command */
204 FILE *fin;
205 {
206 FILE *popen();
207 char *fgets();
208 FILE *pin;
209 char buf[512];
210
211 buf[0] = '\0';
212 fgets(buf, sizeof(buf), fin);
213 if (buf[0] && buf[strlen(buf)-1] == '\n')
214 buf[strlen(buf)-1] = '\0';
215 if ((pin = popen(buf+1, "r")) == NULL) {
216 fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n",
217 progname, fname, buf);
218 exit(1);
219 }
220 xform(buf, pin);
221 pclose(pin);
222 }
223
224
225 xfobject(fname, fin) /* transform an object */
226 char *fname;
227 FILE *fin;
228 {
229 char stmp[MAXSTR];
230 int fn;
231
232 fscanf(fin, "%s", stmp); /* modifier */
233 printf("\n%s ", stmp);
234 fscanf(fin, "%s", stmp); /* object type */
235 if ((fn = otype(stmp)) < 0) {
236 fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
237 progname, fname, stmp);
238 exit(1);
239 }
240 printf("%s ", stmp);
241 fscanf(fin, "%s", stmp); /* object name */
242 if (idprefix != NULL && issurface(fn))
243 printf("%s.%s\n", idprefix, stmp);
244 else
245 printf("%s\n", stmp);
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);
250 exit(1);
251 }
252 }
253
254
255 passargs(fin) /* pass on arguments unchanged */
256 FILE *fin;
257 {
258 register int i;
259 register FUNARGS *fa;
260
261 if ((fa = getfargs(fin)) == NULL)
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]);
267 printf("\n");
268 /* integer arguments */
269 printf("%d", fa->niargs);
270 for (i = 0; i < fa->niargs; i++)
271 printf(" %d", fa->iarg[i]);
272 printf("\n");
273 /* float arguments */
274 printf("%d", fa->nfargs);
275 for (i = 0; i < fa->nfargs; i++)
276 printf(" %18.12g", fa->farg[i]);
277 printf("\n");
278 freefargs(fa);
279 return(0);
280 }
281
282
283 addxform(fin) /* add xf arguments to strings */
284 FILE *fin;
285 {
286 register int i;
287 register FUNARGS *fa;
288
289 if ((fa = getfargs(fin)) == NULL)
290 return(-1);
291 /* string arguments */
292 printf("%d", fa->nsargs + xac-xfa);
293 for (i = 0; i < fa->nsargs; i++)
294 printf(" %s", fa->sarg[i]);
295 for (i = xfa; i < xac; i++) /* add xf arguments */
296 printf(" %s", xav[i]);
297 printf("\n");
298 /* integer arguments */
299 printf("%d", fa->niargs);
300 for (i = 0; i < fa->niargs; i++)
301 printf(" %d", fa->iarg[i]);
302 printf("\n");
303 /* float arguments */
304 printf("%d", fa->nfargs);
305 for (i = 0; i < fa->nfargs; i++)
306 printf(" %18.12g", fa->farg[i]);
307 printf("\n");
308 freefargs(fa);
309 return(0);
310 }
311
312
313 int
314 otype(ofname) /* get object function number from its name */
315 register char *ofname;
316 {
317 register int i;
318
319 for (i = 0; ofun[i].funame != NULL; i++)
320 if (!strcmp(ofun[i].funame, ofname))
321 return(i);
322
323 return(-1); /* not found */
324 }
325
326
327 alias(fin) /* transfer alias */
328 FILE *fin;
329 {
330 char alias[MAXSTR];
331
332 if (fscanf(fin, "%s", alias) != 1)
333 return(-1);
334 printf("\t%s\n", alias);
335 return(0);
336 }
337
338
339 m_glow(fin) /* transform arguments for proximity light */
340 FILE *fin;
341 {
342 register FUNARGS *fa;
343
344 if ((fa = getfargs(fin)) == NULL)
345 return(-1);
346 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
347 return(-1);
348 printf("0\n0\n4");
349 printf(" %18.12g %18.12g %18.12g",
350 fa->farg[0], fa->farg[1], fa->farg[2]);
351 printf(" %18.12g\n", fa->farg[3] * totscale);
352 freefargs(fa);
353 return(0);
354 }
355
356
357 m_spot(fin) /* transform arguments for spotlight */
358 FILE *fin;
359 {
360 double v[3];
361 register FUNARGS *fa;
362
363 if ((fa = getfargs(fin)) == NULL)
364 return(-1);
365 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
366 return(-1);
367 printf("0\n0\n7");
368 printf(" %18.12g %18.12g %18.12g %18.12g\n",
369 fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]);
370 multv3(v, fa->farg+4, totxform);
371 printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
372 freefargs(fa);
373 return(0);
374 }
375
376
377 m_dielectric(fin) /* transform arguments for dielectric */
378 FILE *fin;
379 {
380 double pow();
381 register FUNARGS *fa;
382
383 if ((fa = getfargs(fin)) == NULL)
384 return(-1);
385 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 5)
386 return(-1);
387 printf("0\n0\n5");
388 printf(" %18.12g %18.12g %18.12g",
389 pow(fa->farg[0], 1.0/totscale),
390 pow(fa->farg[1], 1.0/totscale),
391 pow(fa->farg[2], 1.0/totscale));
392 printf(" %18.12g %18.12g\n", fa->farg[3], fa->farg[4]);
393 freefargs(fa);
394 return(0);
395 }
396
397
398 m_interface(fin) /* transform arguments for interface */
399 FILE *fin;
400 {
401 double pow();
402 register FUNARGS *fa;
403
404 if ((fa = getfargs(fin)) == NULL)
405 return(-1);
406 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
407 return(-1);
408 printf("0\n0\n8\n");
409 printf("%18.12g %18.12g %18.12g",
410 pow(fa->farg[0], 1.0/totscale),
411 pow(fa->farg[1], 1.0/totscale),
412 pow(fa->farg[2], 1.0/totscale));
413 printf(" %18.12g\n", fa->farg[3]);
414 printf("%18.12g %18.12g %18.12g",
415 pow(fa->farg[4], 1.0/totscale),
416 pow(fa->farg[5], 1.0/totscale),
417 pow(fa->farg[6], 1.0/totscale));
418 printf(" %18.12g\n", fa->farg[7]);
419 freefargs(fa);
420 return(0);
421 }
422
423
424 text(fin) /* transform text arguments */
425 FILE *fin;
426 {
427 int i;
428 double v[3];
429 register FUNARGS *fa;
430
431 if ((fa = getfargs(fin)) == NULL)
432 return(-1);
433 if (fa->niargs != 0 || (fa->nfargs != 9 &&
434 fa->nfargs != 11 && fa->nfargs != 15))
435 return(-1);
436 /* string arguments */
437 printf("%d", fa->nsargs);
438 for (i = 0; i < fa->nsargs; i++)
439 printf(" %s", fa->sarg[i]);
440 printf("\n0\n%d\n", fa->nfargs);
441 /* anchor point */
442 multp3(v, fa->farg, totxform);
443 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
444 /* right vector */
445 multv3(v, fa->farg+3, totxform);
446 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
447 /* down vector */
448 multv3(v, fa->farg+6, totxform);
449 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
450 /* forground and background */
451 if (fa->nfargs == 11)
452 printf(" %18.12g %18.12g\n", fa->farg[9], fa->farg[10]);
453 else if (fa->nfargs == 15) {
454 printf(" %18.12g %18.12g %18.12g\n",
455 fa->farg[9], fa->farg[10], fa->farg[11]);
456 printf(" %18.12g %18.12g %18.12g\n",
457 fa->farg[12], fa->farg[13], fa->farg[14]);
458 }
459 freefargs(fa);
460 return(0);
461 }
462
463
464 o_source(fin) /* transform source arguments */
465 FILE *fin;
466 {
467 double dv[3];
468 register FUNARGS *fa;
469
470 if ((fa = getfargs(fin)) == NULL)
471 return(-1);
472 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
473 return(-1);
474 /* transform direction vector */
475 multv3(dv, fa->farg, totxform);
476 /* output */
477 printf("0\n0\n4");
478 printf(" %18.12g %18.12g %18.12g %18.12g\n",
479 dv[0], dv[1], dv[2], fa->farg[3]);
480 freefargs(fa);
481 return(0);
482 }
483
484
485 o_sphere(fin) /* transform sphere arguments */
486 FILE *fin;
487 {
488 double cent[3], rad;
489 register FUNARGS *fa;
490
491 if ((fa = getfargs(fin)) == NULL)
492 return(-1);
493 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
494 return(-1);
495
496 multp3(cent, fa->farg, totxform); /* transform center */
497
498 rad = fa->farg[3] * totscale; /* scale radius */
499
500 printf("0\n0\n4");
501 printf(" %18.12g %18.12g %18.12g %18.12g\n",
502 cent[0], cent[1], cent[2], rad);
503 freefargs(fa);
504 return(0);
505 }
506
507
508 o_face(fin) /* transform face arguments */
509 FILE *fin;
510 {
511 double p[3];
512 register int i;
513 register FUNARGS *fa;
514
515 if ((fa = getfargs(fin)) == NULL)
516 return(-1);
517 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs % 3)
518 return(-1);
519
520 printf("0\n0\n%d\n", fa->nfargs);
521
522 for (i = 0; i < fa->nfargs; i += 3) {
523 if (reverse)
524 multp3(p, fa->farg+(fa->nfargs-i-3), totxform);
525 else
526 multp3(p, fa->farg+i, totxform);
527 printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
528 }
529 freefargs(fa);
530 return(0);
531 }
532
533
534 o_cone(fin) /* transform cone and cup arguments */
535 FILE *fin;
536 {
537 double p0[3], p1[3], r0, r1;
538 register FUNARGS *fa;
539
540 if ((fa = getfargs(fin)) == NULL)
541 return(-1);
542 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
543 return(-1);
544
545 printf("0\n0\n8\n");
546
547 multp3(p0, fa->farg, totxform);
548 multp3(p1, fa->farg+3, totxform);
549 r0 = fa->farg[6] * totscale;
550 r1 = fa->farg[7] * totscale;
551 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
552 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
553 printf(" %18.12g %18.12g\n", r0, r1);
554
555 freefargs(fa);
556 return(0);
557 }
558
559
560 o_cylinder(fin) /* transform cylinder and tube arguments */
561 FILE *fin;
562 {
563 double p0[3], p1[3], rad;
564 register FUNARGS *fa;
565
566 if ((fa = getfargs(fin)) == NULL)
567 return(-1);
568 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
569 return(-1);
570
571 printf("0\n0\n7\n");
572
573 multp3(p0, fa->farg, totxform);
574 multp3(p1, fa->farg+3, totxform);
575 rad = fa->farg[6] * totscale;
576 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
577 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
578 printf(" %18.12g\n", rad);
579 freefargs(fa);
580 return(0);
581 }
582
583
584 o_ring(fin) /* transform ring arguments */
585 FILE *fin;
586 {
587 double p0[3], pd[3], r0, r1;
588 register FUNARGS *fa;
589
590 if ((fa = getfargs(fin)) == NULL)
591 return(-1);
592 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
593 return(-1);
594
595 printf("0\n0\n8\n");
596
597 multp3(p0, fa->farg, totxform);
598 multv3(pd, fa->farg+3, totxform);
599 r0 = fa->farg[6] * totscale;
600 r1 = fa->farg[7] * totscale;
601 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
602 printf(" %18.12g %18.12g %18.12g\n", pd[0], pd[1], pd[2]);
603 printf(" %18.12g %18.12g\n", r0, r1);
604 freefargs(fa);
605 return(0);
606 }
607
608
609 FUNARGS *
610 getfargs(fp) /* get function arguments from stream */
611 FILE *fp;
612 {
613 char *strcpy();
614 char sbuf[MAXSTR];
615 int n;
616 register FUNARGS *fa;
617 register int i;
618
619 if ((fa = (FUNARGS *)malloc((unsigned)sizeof(FUNARGS))) == NULL)
620 goto memerr;
621 if (fscanf(fp, "%d", &n) != 1 || n < 0)
622 return(NULL);
623 if (fa->nsargs = n) {
624 fa->sarg = (char **)malloc((unsigned)fa->nsargs*sizeof(char *));
625 if (fa->sarg == NULL)
626 goto memerr;
627 for (i = 0; i < fa->nsargs; i++) {
628 if (fscanf(fp, "%s", sbuf) != 1)
629 return(NULL);
630 if ((fa->sarg[i] = malloc((unsigned)strlen(sbuf)+1)) == NULL)
631 goto memerr;
632 strcpy(fa->sarg[i], sbuf);
633 }
634 } else
635 fa->sarg = NULL;
636 if (fscanf(fp, "%d", &n) != 1 || n < 0)
637 return(NULL);
638 if (fa->niargs = n) {
639 fa->iarg = (int *)malloc((unsigned)fa->niargs*sizeof(int));
640 if (fa->iarg == NULL)
641 goto memerr;
642 for (i = 0; i < fa->niargs; i++)
643 if (fscanf(fp, "%d", &fa->iarg[i]) != 1)
644 return(NULL);
645 } else
646 fa->iarg = NULL;
647 if (fscanf(fp, "%d", &n) != 1 || n < 0)
648 return(NULL);
649 if (fa->nfargs = n) {
650 fa->farg = (double *)malloc((unsigned)fa->nfargs*sizeof(double));
651 if (fa->farg == NULL)
652 goto memerr;
653 for (i = 0; i < fa->nfargs; i++)
654 if (fscanf(fp, "%lf", &fa->farg[i]) != 1)
655 return(NULL);
656 } else
657 fa->farg = NULL;
658 return(fa);
659 memerr:
660 fprintf(stderr, "%s: out of memory in getfargs\n", progname);
661 exit(1);
662 }
663
664
665 freefargs(fa) /* free memory associated with fa */
666 register FUNARGS *fa;
667 {
668 register int i;
669
670 for (i = 0; i < fa->nsargs; i++)
671 free(fa->sarg[i]);
672 if (fa->nsargs)
673 free(fa->sarg);
674 if (fa->niargs)
675 free(fa->iarg);
676 if (fa->nfargs)
677 free(fa->farg);
678 free(fa);
679 }