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

# 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 * genbox.c - generate a parallelepiped.
9 *
10 * 1/8/86
11 */
12
13 #include <stdio.h>
14
15 #include <math.h>
16
17
18 #ifdef DCL_ATOF
19 extern double atof();
20 #endif
21
22 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 }