ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/genbox.c
Revision: 2.4
Committed: Mon Aug 2 14:22:59 1993 UTC (30 years, 8 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.3: +4 -0 lines
Log Message:
added conditional declaration of atof()

File Contents

# User Rev Content
1 greg 1.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     * genbox.c - generate a parallelepiped.
9     *
10     * 1/8/86
11     */
12    
13     #include <stdio.h>
14    
15 greg 2.3 #include <math.h>
16    
17 greg 1.1
18 greg 2.4 #ifdef DCL_ATOF
19     extern double atof();
20     #endif
21    
22 greg 1.1 char let[]="0123456789._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
23    
24     char *cmtype; /* ppd material type */
25    
26     char *cname; /* ppd name */
27    
28     double size[3]; /* ppd size */
29    
30     double bevel = 0.0; /* bevel amount */
31    
32     int round = 0; /* boolean true for round edges */
33    
34     int reverse = 0; /* boolean true for reversed normals */
35    
36    
37     main(argc, argv)
38     int argc;
39     char **argv;
40     {
41     int i;
42    
43     if (argc < 6)
44     goto userr;
45    
46     cmtype = argv[1];
47     cname = argv[2];
48     size[0] = atof(argv[3]);
49     size[1] = atof(argv[4]);
50     size[2] = atof(argv[5]);
51    
52     for (i = 6; i < argc; i++) {
53     if (argv[i][0] != '-')
54     goto userr;
55     switch (argv[i][1]) {
56     case 'r':
57     round = 1;
58     /* fall through */
59     case 'b':
60     bevel = atof(argv[++i]);
61     break;
62     case 'i':
63     reverse = 1;
64     break;
65     default:
66     goto userr;
67     }
68     }
69    
70     printhead(argc, argv);
71    
72     if (bevel > 0.0) {
73     /* minor faces */
74     side(051, 055, 054, 050);
75     side(064, 066, 062, 060);
76     side(032, 033, 031, 030);
77     side(053, 052, 056, 057);
78     side(065, 061, 063, 067);
79     side(036, 034, 035, 037);
80     }
81     if (bevel > 0.0 && !round) {
82     /* bevel faces */
83     side(031, 051, 050, 030);
84     side(060, 062, 032, 030);
85     side(050, 054, 064, 060);
86     side(034, 036, 066, 064);
87     side(037, 057, 056, 036);
88     side(052, 062, 066, 056);
89     side(052, 053, 033, 032);
90     side(057, 067, 063, 053);
91     side(061, 031, 033, 063);
92     side(065, 067, 037, 035);
93     side(055, 051, 061, 065);
94     side(034, 054, 055, 035);
95     /* bevel corners */
96     corner(030, 050, 060);
97     corner(051, 031, 061);
98     corner(032, 062, 052);
99     corner(064, 054, 034);
100     corner(036, 056, 066);
101     corner(065, 035, 055);
102     corner(053, 063, 033);
103     corner(037, 067, 057);
104     }
105     if (bevel > 0.0 && round) {
106     /* round edges */
107     cylinder(070, 071);
108     cylinder(070, 074);
109     cylinder(070, 072);
110     cylinder(073, 071);
111     cylinder(073, 072);
112     cylinder(073, 077);
113     cylinder(075, 071);
114     cylinder(075, 074);
115     cylinder(075, 077);
116     cylinder(076, 072);
117     cylinder(076, 074);
118     cylinder(076, 077);
119     /* round corners */
120     sphere(070);
121     sphere(071);
122     sphere(072);
123     sphere(073);
124     sphere(074);
125     sphere(075);
126     sphere(076);
127     sphere(077);
128     }
129     if (bevel == 0.0 ) {
130     /* only need major faces */
131     side(1, 5, 4, 0);
132     side(4, 6, 2, 0);
133     side(2, 3, 1, 0);
134     side(3, 2, 6, 7);
135     side(5, 1, 3, 7);
136     side(6, 4, 5, 7);
137     }
138     exit(0);
139     userr:
140     fprintf(stderr, "Usage: %s ", argv[0]);
141     fprintf(stderr, "material name xsize ysize zsize ");
142     fprintf(stderr, "[-i] [-b bevel | -r round]\n");
143     exit(1);
144     }
145    
146    
147     side(a, b, c, d) /* generate a rectangular face */
148     int a, b, c, d;
149     {
150     printf("\n%s polygon %s.%c%c%c%c\n", cmtype, cname,
151     let[a], let[b], let[c], let[d]);
152     printf("0\n0\n12\n");
153     if (reverse) {
154     vertex(d);
155     vertex(c);
156     vertex(b);
157     vertex(a);
158     } else {
159     vertex(a);
160     vertex(b);
161     vertex(c);
162     vertex(d);
163     }
164     }
165    
166    
167     corner(a, b, c) /* generate a triangular face */
168     int a, b, c;
169     {
170     printf("\n%s polygon %s.%c%c%c\n", cmtype, cname,
171     let[a], let[b], let[c]);
172     printf("0\n0\n9\n");
173     if (reverse) {
174     vertex(c);
175     vertex(b);
176     vertex(a);
177     } else {
178     vertex(a);
179     vertex(b);
180     vertex(c);
181     }
182     }
183    
184    
185     cylinder(v0, v1) /* generate a cylinder */
186     int v0, v1;
187     {
188     printf("\n%s cylinder %s.%c%c\n", cmtype, cname, v0+'0', v1+'0');
189     printf("0\n0\n7\n");
190     vertex(v0);
191     vertex(v1);
192     printf("\t%18.12g\n", bevel);
193     }
194    
195    
196     sphere(v0) /* generate a sphere */
197     int v0;
198     {
199     printf("\n%s sphere %s.%c\n", cmtype, cname, v0+'0');
200     printf("0\n0\n4\n");
201     vertex(v0);
202     printf("\t%18.12g\n", bevel);
203     }
204    
205    
206     vertex(v)
207     register int v;
208     {
209     register int i;
210    
211     for (i = 0; i < 3; i++) {
212     if (v & 010)
213     printf("\t%18.12g", v & 01 ? size[i]-bevel : bevel);
214     else
215     printf("\t%18.12g", v & 01 ? size[i] : 0.0);
216     v >>= 1;
217     }
218     printf("\n");
219     }
220    
221    
222     printhead(ac, av) /* print command header */
223     register int ac;
224     register char **av;
225     {
226     putchar('#');
227     while (ac--) {
228     putchar(' ');
229     fputs(*av++, stdout);
230     }
231     putchar('\n');
232     }