ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/genbox.c
Revision: 2.2
Committed: Thu Dec 19 15:08:16 1991 UTC (32 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.1: +3 -1 lines
Log Message:
removed atof declaration for NeXT

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