ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.1
Committed: Thu Feb 2 11:16:33 1989 UTC (35 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Initial revision

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