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

# User Rev Content
1 greg 1.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     }