65 GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth)
73 r1 = outer_radius - tooth_depth / 2.0;
74 r2 = outer_radius + tooth_depth / 2.0;
76 const double pi = 3.14159264;
77 da = 2.0 * pi / teeth / 4.0;
79 glShadeModel(GL_FLAT);
80 glNormal3f(0.0, 0.0, 1.0);
83 glBegin(GL_QUAD_STRIP);
84 for (i = 0; i <= teeth; i++) {
85 angle = i * 2.0 * pi / teeth;
86 glVertex3f(r0 *
cos(angle), r0 * sin(angle), width * 0.5);
87 glVertex3f(r1 *
cos(angle), r1 * sin(angle), width * 0.5);
88 glVertex3f(r0 *
cos(angle), r0 * sin(angle), width * 0.5);
89 glVertex3f(r1 *
cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
95 da = 2.0 * pi / teeth / 4.0;
96 for (i = 0; i < teeth; i++) {
97 angle = i * 2.0 * pi / teeth;
98 glVertex3f(r1 *
cos(angle), r1 * sin(angle), width * 0.5);
99 glVertex3f(r2 *
cos(angle + da), r2 * sin(angle + da), width * 0.5);
100 glVertex3f(r2 *
cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
101 glVertex3f(r1 *
cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
105 glNormal3f(0.0, 0.0, -1.0);
108 glBegin(GL_QUAD_STRIP);
109 for (i = 0; i <= teeth; i++) {
110 angle = i * 2.0 * pi / teeth;
111 glVertex3f(r1 *
cos(angle), r1 * sin(angle), -width * 0.5);
112 glVertex3f(r0 *
cos(angle), r0 * sin(angle), -width * 0.5);
113 glVertex3f(r1 *
cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
114 glVertex3f(r0 *
cos(angle), r0 * sin(angle), -width * 0.5);
120 da = 2.0 * pi / teeth / 4.0;
121 for (i = 0; i < teeth; i++) {
122 angle = i * 2.0 * pi / teeth;
123 glVertex3f(r1 *
cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
124 glVertex3f(r2 *
cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
125 glVertex3f(r2 *
cos(angle + da), r2 * sin(angle + da), -width * 0.5);
126 glVertex3f(r1 *
cos(angle), r1 * sin(angle), -width * 0.5);
131 glBegin(GL_QUAD_STRIP);
132 for (i = 0; i < teeth; i++) {
133 angle = i * 2.0 * pi / teeth;
134 glVertex3f(r1 *
cos(angle), r1 * sin(angle), width * 0.5);
135 glVertex3f(r1 *
cos(angle), r1 * sin(angle), -width * 0.5);
136 u = r2 *
cos(angle + da) - r1 *
cos(angle);
137 v = r2 * sin(angle + da) - r1 * sin(angle);
141 glNormal3f(
v, -u, 0.0);
142 glVertex3f(r2 *
cos(angle + da), r2 * sin(angle + da), width * 0.5);
143 glVertex3f(r2 *
cos(angle + da), r2 * sin(angle + da), -width * 0.5);
144 glNormal3f(
cos(angle), sin(angle), 0.0);
145 glVertex3f(r2 *
cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
146 glVertex3f(r2 *
cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
147 u = r1 *
cos(angle + 3 * da) - r2 *
cos(angle + 2 * da);
148 v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
149 glNormal3f(
v, -u, 0.0);
150 glVertex3f(r1 *
cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
151 glVertex3f(r1 *
cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
152 glNormal3f(
cos(angle), sin(angle), 0.0);
154 glVertex3f(r1 *
cos(0.0), r1 * sin(0.0), width * 0.5);
155 glVertex3f(r1 *
cos(0.0), r1 * sin(0.0), -width * 0.5);
158 glShadeModel(GL_SMOOTH);
161 glBegin(GL_QUAD_STRIP);
162 for (i = 0; i <= teeth; i++) {
163 angle = i * 2.0 * pi / teeth;
164 glNormal3f(-
cos(angle), -sin(angle), 0.0);
165 glVertex3f(r0 *
cos(angle), r0 * sin(angle), -width * 0.5);
166 glVertex3f(r0 *
cos(angle), r0 * sin(angle), width * 0.5);
173 static GLfloat
pos[4] = {5.0f, 5.0f, 10.0f, 1.0f};
174 static GLfloat ared[4] = {0.8f, 0.1f, 0.0f, 1.0f};
175 static GLfloat agreen[4] = {0.0f, 0.8f, 0.2f, 1.0f};
176 static GLfloat ablue[4] = {0.2f, 0.2f, 1.0f, 1.0f};
178 glLightfv(GL_LIGHT0, GL_POSITION,
pos);
179 glEnable(GL_CULL_FACE);
180 glEnable(GL_LIGHTING);
182 glEnable(GL_DEPTH_TEST);
186 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ared);
187 gearGL(1.0f, 4.0f, 1.0f, 20, 0.7f);
190 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, agreen);
191 gearGL(0.5f, 2.0f, 2.0f, 10, 0.7f);
194 glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ablue);
195 gearGL(1.3f, 2.0f, 0.5f, 10, 0.7f);
200 glEnable(GL_NORMALIZE);
236 int noOfScanlines = 0, lowerScanline = 0;
238 int verticalBlankingInterval = 32;
239 float left, right, bottom,
top;
240 float nearplane, farplane, zeroPlane,
distance;
241 float eyeSeparation = 0.62f;
252 noOfScanlines = (bnds.
getHeight() - verticalBlankingInterval) / 2;
256 lowerScanline = bnds.
getHeight() - noOfScanlines;
270 glViewport(0, lowerScanline, bnds.
getWidth(), noOfScanlines);
293 -eyeSeparation / 2.0);
304 eyeSeparation / 2.0);
313 glMatrixMode(GL_PROJECTION);
315 glFrustum(left, right, bottom, top, 5.0, 60.0);
316 glMatrixMode(GL_MODELVIEW);
318 glTranslatef(0.0, 0.0, -40.0);
321 glClearColor(.2f, 0.0f, 0.0f, 0.0f);
357 float xmid, ymid, clip_near, clip_far, topw, bottomw, leftw, rightw, dx, dy, n_over_d;
362 xmid = (right +
left) / 2.0;
363 ymid = (top + bottom) / 2.0;
365 clip_near = dist + zero_plane - nearplane;
366 clip_far = dist + zero_plane - farplane;
368 n_over_d = clip_near / dist;
370 topw = n_over_d * dy / 2.0;
372 rightw = n_over_d * (dx / 2.0 - eye);
373 leftw = n_over_d * (-dx / 2.0 - eye);
377 glFrustum(leftw, rightw, bottomw, topw, clip_near, clip_far);
379 glTranslatef(-xmid - eye, -ymid, -zero_plane - dist);