ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/genbox.c
Revision: 1.1
Committed: Thu Feb 2 11:16:26 1989 UTC (35 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Initial revision

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