ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/genbox.c
Revision: 2.9
Committed: Wed Apr 7 21:13:52 2021 UTC (3 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.8: +20 -14 lines
Log Message:
fix(genbox): minor changes and fixing "rounde" in comments and usage

File Contents

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