ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/genbox.c
Revision: 2.7
Committed: Sun Nov 16 10:29:38 2003 UTC (20 years, 4 months ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2, rad4R2P2, rad5R0, rad5R1, rad3R7P2, rad3R7P1, rad4R2, rad4R1, rad4R0, rad3R6, rad3R6P1, rad3R8, rad3R9, rad4R2P1
Changes since 2.6: +4 -1 lines
Log Message:
Continued ANSIfication and reduced other compile warnings.

File Contents

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