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