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

# 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 greg 2.2 #ifndef atof
16     extern double atof();
17     #endif
18 greg 1.1
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     }