ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
Revision: 1.15
Committed: Tue Jul 23 15:24:21 1991 UTC (32 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.14: +23 -17 lines
Log Message:
moved readfargs() to library

File Contents

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