ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/genbox.c
Revision: 2.10
Committed: Thu Apr 8 15:13:08 2021 UTC (3 years ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.9: +10 -24 lines
Log Message:
perf(genbox): Simplified method for normal inversion

File Contents

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