ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/genclock.c
Revision: 2.4
Committed: Sat Feb 22 02:07:23 2003 UTC (21 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 2.3: +2 -8 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * Generate an analog clock.
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <math.h>
11 #include <ctype.h>
12
13 #define PI 3.14159265358979323846
14
15 #define FACEBITMAP "clockface.hex"
16
17 char myfacemat[] = "white_plastic";
18 double myfacearg[5] = {.85,.85,.85,0,0};
19 char mycasemat[] = "black_plastic";
20 double mycasearg[5] = {.08,.08,.08,.03,.04};
21 char *facemat = myfacemat;
22 char *casemat = mycasemat;
23 char *name = "clock";
24
25 main(argc, argv)
26 int argc;
27 char *argv[];
28 {
29 int i, j;
30 double hour;
31
32 for (i = 1; i < argc && argv[i][0] == '-'; i++)
33 switch (argv[i][1]) {
34 case 'f':
35 facemat = argv[++i];
36 break;
37 case 'c':
38 casemat = argv[++i];
39 break;
40 case 'n':
41 name = argv[++i];
42 break;
43 default:
44 goto userr;
45 }
46 if (i >= argc)
47 goto userr;
48 if (!isdigit(argv[i][0]))
49 goto userr;
50 for (j = 1; isdigit(argv[i][j]); j++)
51 ;
52 if (argv[i][j] == ':')
53 hour = atoi(argv[i]) + atoi(argv[i]+j+1)/60.0;
54 else if (!argv[i][j] || argv[i][j] == '.')
55 hour = atof(argv[i]);
56 else
57 goto userr;
58 putchar('#'); /* print header */
59 for (i = 0; i < argc; i++) {
60 putchar(' ');
61 fputs(argv[i], stdout);
62 }
63 putchar('\n');
64 genmats(); /* print materials */
65 genclock(); /* generate clock */
66 genhands(hour); /* generate hands */
67 exit(0);
68 userr:
69 fputs("Usage: ", stderr);
70 fputs(argv[0], stderr);
71 fputs(" [-f face_mat][-c case_mat][-n name] {HH:MM | HH.hh}\n", stderr);
72 exit(1);
73 }
74
75
76 genmats() /* put out our materials */
77 {
78 if (facemat == myfacemat)
79 printf("\nvoid plastic %s\n0\n0\n5 %f %f %f %f %f\n",
80 myfacemat, myfacearg[0], myfacearg[1],
81 myfacearg[2], myfacearg[3], myfacearg[4]);
82 if (casemat == mycasemat)
83 printf("\nvoid plastic %s\n0\n0\n5 %f %f %f %f %f\n",
84 mycasemat, mycasearg[0], mycasearg[1],
85 mycasearg[2], mycasearg[3], mycasearg[4]);
86 printf("\n%s brighttext clock_face_paint\n2 hexbit4x1.fnt %s\n",
87 facemat, FACEBITMAP);
88 printf("0\n11\n\t0\t-1\t1\n\t0\t.0185\t0\n\t0\t0\t-.00463\n");
89 printf("\t.02\t1\n");
90 printf("\nvoid glass clock_crystal\n0\n0\n3 .95 .95 .95\n");
91 printf("\nvoid plastic hand_paint\n0\n0\n5 .03 .03 .03 0 0\n");
92 }
93
94
95 genclock() /* put out clock body */
96 {
97 printf("\n%s ring %s.case_back\n", casemat, name);
98 printf("0\n0\n8\t0\t0\t0\n\t-1\t0\t0\n\t0\t1.1\n");
99 printf("\n%s cylinder %s.case_outer\n", casemat, name);
100 printf("0\n0\n7\t0\t0\t0\n\t.12\t0\t0\n\t1.1\n");
101 printf("\n%s ring %s.case_front\n", casemat, name);
102 printf("0\n0\n8\t.12\t0\t0\n\t1\t0\t0\n\t1\t1.1\n");
103 printf("\n%s cylinder %s.case_inner\n", casemat, name);
104 printf("0\n0\n7\t.05\t0\t0\n\t.12\t0\t0\n\t1\n");
105 printf("\nclock_crystal ring %s.crystal\n", name);
106 printf("0\n0\n8\t.10\t0\t0\n\t1\t0\t0\n\t0\t1\n");
107 printf("\nclock_face_paint ring %s.face\n", name);
108 printf("0\n0\n8\t.05\t0\t0\n\t1\t0\t0\n\t0\t1\n");
109 }
110
111
112 genhands(hour) /* generate correct hand positions */
113 double hour;
114 {
115 double hrot, mrot;
116
117 hrot = 2.*PI/12. * hour;
118 mrot = 2.*PI * (hour - floor(hour));
119
120 printf("\nhand_paint polygon %s.hour_hand\n", name);
121 printf("0\n0\n12\n");
122 rvert(.06, -.03, -.06, hrot);
123 rvert(.06, .03, -.06, hrot);
124 rvert(.06, .025, .5, hrot);
125 rvert(.06, -.025, .5, hrot);
126
127 printf("\nhand_paint polygon %s.minute_hand\n", name);
128 printf("0\n0\n12\n");
129 rvert(.07, -.02, -.1, mrot);
130 rvert(.07, .02, -.1, mrot);
131 rvert(.07, .01, .9, mrot);
132 rvert(.07, -.01, .9, mrot);
133 }
134
135
136 rvert(x, y, z, ang) /* print rotated vertex */
137 double x, y, z, ang;
138 {
139 static double lastang=0, sa=0, ca=1;
140
141 if (ang != lastang) {
142 sa = sin(-ang);
143 ca = cos(-ang);
144 lastang = ang;
145 }
146 printf("%15.12g %15.12g %15.12g\n", x, y*ca-z*sa, z*ca+y*sa);
147 }