ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.7
Committed: Wed Oct 4 16:28:14 1989 UTC (34 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.6: +18 -22 lines
Log Message:
Added multi-line commands.

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 xfcomm(name, fin);
185 } else { /* object */
186 ungetc(c, fin);
187 xfobject(name, fin);
188 }
189 }
190 }
191
192
193 xfcomm(fname, fin) /* transform a command */
194 FILE *fin;
195 {
196 FILE *popen();
197 char *fgetline();
198 FILE *pin;
199 char buf[512];
200 int i;
201
202 fgetline(buf, sizeof(buf), fin);
203 if (expand) {
204 if ((pin = popen(buf+1, "r")) == NULL) {
205 fprintf(stderr, "%s: (%s): cannot execute \"%s\"\n",
206 progname, fname, buf);
207 exit(1);
208 }
209 xform(buf, pin);
210 pclose(pin);
211 } else {
212 printf("\n%s | %s -e", buf, xav[0]);
213 for (i = 1; i < xac; i++)
214 printf(" %s", xav[i]);
215 putchar('\n');
216 }
217 }
218
219
220 xfobject(fname, fin) /* transform an object */
221 char *fname;
222 FILE *fin;
223 {
224 char stmp[MAXSTR];
225 int fn;
226
227 fscanf(fin, "%s", stmp); /* modifier */
228 printf("\n%s ", stmp);
229 fscanf(fin, "%s", stmp); /* object type */
230 if ((fn = otype(stmp)) < 0) {
231 fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
232 progname, fname, stmp);
233 exit(1);
234 }
235 printf("%s ", stmp);
236 fscanf(fin, "%s", stmp); /* object name */
237 if (idprefix != NULL && issurface(fn))
238 printf("%s.%s\n", idprefix, stmp);
239 else
240 printf("%s\n", stmp);
241 /* transform arguments */
242 if ((*ofun[fn].funp)(fin) < 0) {
243 fprintf(stderr, "%s: (%s): bad %s \"%s\"\n",
244 progname, fname, ofun[fn].funame, stmp);
245 exit(1);
246 }
247 }
248
249
250 passargs(fin) /* pass on arguments unchanged */
251 FILE *fin;
252 {
253 register int i;
254 register FUNARGS *fa;
255
256 if ((fa = getfargs(fin)) == NULL)
257 return(-1);
258 /* string arguments */
259 printf("%d", fa->nsargs);
260 for (i = 0; i < fa->nsargs; i++)
261 printf(" %s", fa->sarg[i]);
262 printf("\n");
263 /* integer arguments */
264 printf("%d", fa->niargs);
265 for (i = 0; i < fa->niargs; i++)
266 printf(" %d", fa->iarg[i]);
267 printf("\n");
268 /* float arguments */
269 printf("%d", fa->nfargs);
270 for (i = 0; i < fa->nfargs; i++)
271 printf(" %18.12g", fa->farg[i]);
272 printf("\n");
273 freefargs(fa);
274 return(0);
275 }
276
277
278 addxform(fin) /* add xf arguments to strings */
279 FILE *fin;
280 {
281 register int i;
282 register FUNARGS *fa;
283
284 if ((fa = getfargs(fin)) == NULL)
285 return(-1);
286 /* string arguments */
287 printf("%d", fa->nsargs + xac-xfa);
288 for (i = 0; i < fa->nsargs; i++)
289 printf(" %s", fa->sarg[i]);
290 for (i = xfa; i < xac; i++) /* add xf arguments */
291 printf(" %s", xav[i]);
292 printf("\n");
293 /* integer arguments */
294 printf("%d", fa->niargs);
295 for (i = 0; i < fa->niargs; i++)
296 printf(" %d", fa->iarg[i]);
297 printf("\n");
298 /* float arguments */
299 printf("%d", fa->nfargs);
300 for (i = 0; i < fa->nfargs; i++)
301 printf(" %18.12g", fa->farg[i]);
302 printf("\n");
303 freefargs(fa);
304 return(0);
305 }
306
307
308 int
309 otype(ofname) /* get object function number from its name */
310 register char *ofname;
311 {
312 register int i;
313
314 for (i = 0; ofun[i].funame != NULL; i++)
315 if (!strcmp(ofun[i].funame, ofname))
316 return(i);
317
318 return(-1); /* not found */
319 }
320
321
322 alias(fin) /* transfer alias */
323 FILE *fin;
324 {
325 char alias[MAXSTR];
326
327 if (fscanf(fin, "%s", alias) != 1)
328 return(-1);
329 printf("\t%s\n", alias);
330 return(0);
331 }
332
333
334 m_glow(fin) /* transform arguments for proximity light */
335 FILE *fin;
336 {
337 register FUNARGS *fa;
338
339 if ((fa = getfargs(fin)) == NULL)
340 return(-1);
341 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
342 return(-1);
343 printf("0\n0\n4");
344 printf(" %18.12g %18.12g %18.12g",
345 fa->farg[0], fa->farg[1], fa->farg[2]);
346 printf(" %18.12g\n", fa->farg[3] * totscale);
347 freefargs(fa);
348 return(0);
349 }
350
351
352 m_spot(fin) /* transform arguments for spotlight */
353 FILE *fin;
354 {
355 double v[3];
356 register FUNARGS *fa;
357
358 if ((fa = getfargs(fin)) == NULL)
359 return(-1);
360 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
361 return(-1);
362 printf("0\n0\n7");
363 printf(" %18.12g %18.12g %18.12g %18.12g\n",
364 fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]);
365 multv3(v, fa->farg+4, totxform);
366 printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
367 freefargs(fa);
368 return(0);
369 }
370
371
372 m_dielectric(fin) /* transform arguments for dielectric */
373 FILE *fin;
374 {
375 double pow();
376 register FUNARGS *fa;
377
378 if ((fa = getfargs(fin)) == NULL)
379 return(-1);
380 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 5)
381 return(-1);
382 printf("0\n0\n5");
383 printf(" %18.12g %18.12g %18.12g",
384 pow(fa->farg[0], 1.0/totscale),
385 pow(fa->farg[1], 1.0/totscale),
386 pow(fa->farg[2], 1.0/totscale));
387 printf(" %18.12g %18.12g\n", fa->farg[3], fa->farg[4]);
388 freefargs(fa);
389 return(0);
390 }
391
392
393 m_interface(fin) /* transform arguments for interface */
394 FILE *fin;
395 {
396 double pow();
397 register FUNARGS *fa;
398
399 if ((fa = getfargs(fin)) == NULL)
400 return(-1);
401 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
402 return(-1);
403 printf("0\n0\n8\n");
404 printf("%18.12g %18.12g %18.12g",
405 pow(fa->farg[0], 1.0/totscale),
406 pow(fa->farg[1], 1.0/totscale),
407 pow(fa->farg[2], 1.0/totscale));
408 printf(" %18.12g\n", fa->farg[3]);
409 printf("%18.12g %18.12g %18.12g",
410 pow(fa->farg[4], 1.0/totscale),
411 pow(fa->farg[5], 1.0/totscale),
412 pow(fa->farg[6], 1.0/totscale));
413 printf(" %18.12g\n", fa->farg[7]);
414 freefargs(fa);
415 return(0);
416 }
417
418
419 text(fin) /* transform text arguments */
420 FILE *fin;
421 {
422 int i;
423 double v[3];
424 register FUNARGS *fa;
425
426 if ((fa = getfargs(fin)) == NULL)
427 return(-1);
428 if (fa->niargs != 0 || (fa->nfargs != 9 &&
429 fa->nfargs != 11 && fa->nfargs != 15))
430 return(-1);
431 /* string arguments */
432 printf("%d", fa->nsargs);
433 for (i = 0; i < fa->nsargs; i++)
434 printf(" %s", fa->sarg[i]);
435 printf("\n0\n%d\n", fa->nfargs);
436 /* anchor point */
437 multp3(v, fa->farg, totxform);
438 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
439 /* right vector */
440 multv3(v, fa->farg+3, totxform);
441 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
442 /* down vector */
443 multv3(v, fa->farg+6, totxform);
444 printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
445 /* forground and background */
446 if (fa->nfargs == 11)
447 printf(" %18.12g %18.12g\n", fa->farg[9], fa->farg[10]);
448 else if (fa->nfargs == 15) {
449 printf(" %18.12g %18.12g %18.12g\n",
450 fa->farg[9], fa->farg[10], fa->farg[11]);
451 printf(" %18.12g %18.12g %18.12g\n",
452 fa->farg[12], fa->farg[13], fa->farg[14]);
453 }
454 freefargs(fa);
455 return(0);
456 }
457
458
459 o_source(fin) /* transform source arguments */
460 FILE *fin;
461 {
462 double dv[3];
463 register FUNARGS *fa;
464
465 if ((fa = getfargs(fin)) == NULL)
466 return(-1);
467 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
468 return(-1);
469 /* transform direction vector */
470 multv3(dv, fa->farg, totxform);
471 /* output */
472 printf("0\n0\n4");
473 printf(" %18.12g %18.12g %18.12g %18.12g\n",
474 dv[0], dv[1], dv[2], fa->farg[3]);
475 freefargs(fa);
476 return(0);
477 }
478
479
480 o_sphere(fin) /* transform sphere arguments */
481 FILE *fin;
482 {
483 double cent[3], rad;
484 register FUNARGS *fa;
485
486 if ((fa = getfargs(fin)) == NULL)
487 return(-1);
488 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
489 return(-1);
490
491 multp3(cent, fa->farg, totxform); /* transform center */
492
493 rad = fa->farg[3] * totscale; /* scale radius */
494
495 printf("0\n0\n4");
496 printf(" %18.12g %18.12g %18.12g %18.12g\n",
497 cent[0], cent[1], cent[2], rad);
498 freefargs(fa);
499 return(0);
500 }
501
502
503 o_face(fin) /* transform face arguments */
504 FILE *fin;
505 {
506 double p[3];
507 register int i;
508 register FUNARGS *fa;
509
510 if ((fa = getfargs(fin)) == NULL)
511 return(-1);
512 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs % 3)
513 return(-1);
514
515 printf("0\n0\n%d\n", fa->nfargs);
516
517 for (i = 0; i < fa->nfargs; i += 3) {
518 if (reverse)
519 multp3(p, fa->farg+(fa->nfargs-i-3), totxform);
520 else
521 multp3(p, fa->farg+i, totxform);
522 printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
523 }
524 freefargs(fa);
525 return(0);
526 }
527
528
529 o_cone(fin) /* transform cone and cup arguments */
530 FILE *fin;
531 {
532 double p0[3], p1[3], r0, r1;
533 register FUNARGS *fa;
534
535 if ((fa = getfargs(fin)) == NULL)
536 return(-1);
537 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
538 return(-1);
539
540 printf("0\n0\n8\n");
541
542 multp3(p0, fa->farg, totxform);
543 multp3(p1, fa->farg+3, totxform);
544 r0 = fa->farg[6] * totscale;
545 r1 = fa->farg[7] * totscale;
546 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
547 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
548 printf(" %18.12g %18.12g\n", r0, r1);
549
550 freefargs(fa);
551 return(0);
552 }
553
554
555 o_cylinder(fin) /* transform cylinder and tube arguments */
556 FILE *fin;
557 {
558 double p0[3], p1[3], rad;
559 register FUNARGS *fa;
560
561 if ((fa = getfargs(fin)) == NULL)
562 return(-1);
563 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
564 return(-1);
565
566 printf("0\n0\n7\n");
567
568 multp3(p0, fa->farg, totxform);
569 multp3(p1, fa->farg+3, totxform);
570 rad = fa->farg[6] * totscale;
571 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
572 printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
573 printf(" %18.12g\n", rad);
574 freefargs(fa);
575 return(0);
576 }
577
578
579 o_ring(fin) /* transform ring arguments */
580 FILE *fin;
581 {
582 double p0[3], pd[3], r0, r1;
583 register FUNARGS *fa;
584
585 if ((fa = getfargs(fin)) == NULL)
586 return(-1);
587 if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
588 return(-1);
589
590 printf("0\n0\n8\n");
591
592 multp3(p0, fa->farg, totxform);
593 multv3(pd, fa->farg+3, totxform);
594 r0 = fa->farg[6] * totscale;
595 r1 = fa->farg[7] * totscale;
596 printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
597 printf(" %18.12g %18.12g %18.12g\n", pd[0], pd[1], pd[2]);
598 printf(" %18.12g %18.12g\n", r0, r1);
599 freefargs(fa);
600 return(0);
601 }
602
603
604 FUNARGS *
605 getfargs(fp) /* get function arguments from stream */
606 FILE *fp;
607 {
608 char *strcpy();
609 char sbuf[MAXSTR];
610 int n;
611 register FUNARGS *fa;
612 register int i;
613
614 if ((fa = (FUNARGS *)malloc((unsigned)sizeof(FUNARGS))) == NULL)
615 goto memerr;
616 if (fscanf(fp, "%d", &n) != 1 || n < 0)
617 return(NULL);
618 if (fa->nsargs = n) {
619 fa->sarg = (char **)malloc((unsigned)fa->nsargs*sizeof(char *));
620 if (fa->sarg == NULL)
621 goto memerr;
622 for (i = 0; i < fa->nsargs; i++) {
623 if (fscanf(fp, "%s", sbuf) != 1)
624 return(NULL);
625 if ((fa->sarg[i] = malloc((unsigned)strlen(sbuf)+1)) == NULL)
626 goto memerr;
627 strcpy(fa->sarg[i], sbuf);
628 }
629 } else
630 fa->sarg = NULL;
631 if (fscanf(fp, "%d", &n) != 1 || n < 0)
632 return(NULL);
633 if (fa->niargs = n) {
634 fa->iarg = (int *)malloc((unsigned)fa->niargs*sizeof(int));
635 if (fa->iarg == NULL)
636 goto memerr;
637 for (i = 0; i < fa->niargs; i++)
638 if (fscanf(fp, "%d", &fa->iarg[i]) != 1)
639 return(NULL);
640 } else
641 fa->iarg = NULL;
642 if (fscanf(fp, "%d", &n) != 1 || n < 0)
643 return(NULL);
644 if (fa->nfargs = n) {
645 fa->farg = (double *)malloc((unsigned)fa->nfargs*sizeof(double));
646 if (fa->farg == NULL)
647 goto memerr;
648 for (i = 0; i < fa->nfargs; i++)
649 if (fscanf(fp, "%lf", &fa->farg[i]) != 1)
650 return(NULL);
651 } else
652 fa->farg = NULL;
653 return(fa);
654 memerr:
655 fprintf(stderr, "%s: out of memory in getfargs\n", progname);
656 exit(1);
657 }
658
659
660 freefargs(fa) /* free memory associated with fa */
661 register FUNARGS *fa;
662 {
663 register int i;
664
665 for (i = 0; i < fa->nsargs; i++)
666 free(fa->sarg[i]);
667 if (fa->nsargs)
668 free(fa->sarg);
669 if (fa->niargs)
670 free(fa->iarg);
671 if (fa->nfargs)
672 free(fa->farg);
673 free(fa);
674 }