TinyGL 0.4.1 for MinGW
gears.c
Go to the documentation of this file.
1/* gears.c */
2
3/*
4 * 3-D gear wheels. This program is in the public domain.
5 *
6 * Brian Paul
7 */
8
9
10#include <math.h>
11#include <stdlib.h>
12#include <stdio.h>
13#include <string.h>
14
15
16#include <windows.h>
17
18//#include <GL/glx.h>
19#include <GL/gdi.h>
20#include <GL/gl.h>
21#include "ui.h"
22
23#ifndef M_PI
24# define M_PI 3.14159265
25#endif
26
27
28/*
29 * Draw a gear wheel. You'll probably want to call this function when
30 * building a display list since we do a lot of trig here.
31 *
32 * Input: inner_radius - radius of hole at center
33 * outer_radius - radius at center of teeth
34 * width - width of gear
35 * teeth - number of teeth
36 * tooth_depth - depth of tooth
37 */
38static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
39 GLint teeth, GLfloat tooth_depth )
40{
41 GLint i;
42 GLfloat r0, r1, r2;
43 GLfloat angle, da;
44 GLfloat u, v, len;
45
46 r0 = inner_radius;
47 r1 = outer_radius - tooth_depth/2.0;
48 r2 = outer_radius + tooth_depth/2.0;
49
50 da = 2.0*M_PI / teeth / 4.0;
51
53
54 glNormal3f( 0.0, 0.0, 1.0 );
55
56 /* draw front face */
58 for (i=0;i<=teeth;i++) {
59 angle = i * 2.0*M_PI / teeth;
60 glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
61 glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
62 glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
63 glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
64 }
65 glEnd();
66
67 /* draw front sides of teeth */
69 da = 2.0*M_PI / teeth / 4.0;
70 for (i=0;i<teeth;i++) {
71 angle = i * 2.0*M_PI / teeth;
72
73 glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
74 glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 );
75 glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 );
76 glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
77 }
78 glEnd();
79
80
81 glNormal3f( 0.0, 0.0, -1.0 );
82
83 /* draw back face */
85 for (i=0;i<=teeth;i++) {
86 angle = i * 2.0*M_PI / teeth;
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 );
90 glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
91 }
92 glEnd();
93
94 /* draw back sides of teeth */
96 da = 2.0*M_PI / teeth / 4.0;
97 for (i=0;i<teeth;i++) {
98 angle = i * 2.0*M_PI / teeth;
99
100 glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
101 glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 );
102 glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 );
103 glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
104 }
105 glEnd();
106
107
108 /* draw outward faces of teeth */
110 for (i=0;i<teeth;i++) {
111 angle = i * 2.0*M_PI / teeth;
112
113 glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 );
114 glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 );
115 u = r2*cos(angle+da) - r1*cos(angle);
116 v = r2*sin(angle+da) - r1*sin(angle);
117 len = sqrt( u*u + v*v );
118 u /= len;
119 v /= len;
120 glNormal3f( v, -u, 0.0 );
121 glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 );
122 glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 );
123 glNormal3f( cos(angle), sin(angle), 0.0 );
124 glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 );
125 glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 );
126 u = r1*cos(angle+3*da) - r2*cos(angle+2*da);
127 v = r1*sin(angle+3*da) - r2*sin(angle+2*da);
128 glNormal3f( v, -u, 0.0 );
129 glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 );
130 glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 );
131 glNormal3f( cos(angle), sin(angle), 0.0 );
132 }
133
134 glVertex3f( r1*cos(0), r1*sin(0), width*0.5 );
135 glVertex3f( r1*cos(0), r1*sin(0), -width*0.5 );
136
137 glEnd();
138
139
141
142 /* draw inside radius cylinder */
144 for (i=0;i<=teeth;i++) {
145 angle = i * 2.0*M_PI / teeth;
146 glNormal3f( -cos(angle), -sin(angle), 0.0 );
147 glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 );
148 glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 );
149 }
150 glEnd();
151
152}
153
154
155static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0;
156static GLint gear1, gear2, gear3;
157static GLfloat angle = 0.0;
158
159static GLuint limit;
160static GLuint count = 1;
161
162
163void draw( void )
164{
165 glClearColor(0.1, 0.1, 0.9, 0.0);
167
168 glPushMatrix();
169 glRotatef( view_rotx, 1.0, 0.0, 0.0 );
170 glRotatef( view_roty, 0.0, 1.0, 0.0 );
171 glRotatef( view_rotz, 0.0, 0.0, 1.0 );
172
173 glPushMatrix();
174 glTranslatef( -3.0, -2.0, 0.0 );
175 glRotatef( angle, 0.0, 0.0, 1.0 );
176 glCallList(gear1);
177 glPopMatrix();
178
179 glPushMatrix();
180 glTranslatef( 3.1, -2.0, 0.0 );
181 glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 );
182 glCallList(gear2);
183 glPopMatrix();
184
185 glPushMatrix();
186 glTranslatef( -3.1, 4.2, 0.0 );
187 glRotatef( -2.0*angle-25.0, 0.0, 0.0, 1.0 );
188 glCallList(gear3);
189 glPopMatrix();
190
191 glPopMatrix();
192
194
195 count++;
196 if (count==limit) {
197 exit(0);
198 }
199}
200
201
202
203void idle( void )
204{
205 angle += 2.0;
206 //draw();
207}
208
209
210
211/* change view angle, exit upon ESC */
212GLenum key(int k, GLenum mask)
213{
214 switch (k) {
215 case KEY_UP:
216 view_rotx += 5.0;
217 return GL_TRUE;
218 case KEY_DOWN:
219 view_rotx -= 5.0;
220 return GL_TRUE;
221 case KEY_LEFT:
222 view_roty += 5.0;
223 return GL_TRUE;
224 case KEY_RIGHT:
225 view_roty -= 5.0;
226 return GL_TRUE;
227 case 'z':
228 view_rotz += 5.0;
229 return GL_TRUE;
230 case 'Z':
231 view_rotz -= 5.0;
232 return GL_TRUE;
233 case KEY_ESCAPE:
234 exit(0);
235 }
236 return GL_FALSE;
237}
238
239
240
241/* new window size or exposure */
242void reshape( int width, int height )
243{
244 GLfloat h = (GLfloat) height / (GLfloat) width;
245
246 glViewport(0, 0, (GLint)width, (GLint)height);
249 glFrustum( -1.0, 1.0, -h, h, 5.0, 60.0 );
252 glTranslatef( 0.0, 0.0, -40.0 );
254}
255
256
257void init( void )
258{
259 static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0 };
260 static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0 };
261 static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0 };
262 static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 };
263
269
270
271// glCullFace( GL_BACK );
273// glDisable( GL_DITHER );
274// glShadeModel( GL_FLAT );
276
277
278
279 /* make the gears */
280 gear1 = glGenLists(1);
281 glNewList(gear1, GL_COMPILE);
283 gear( 1.0, 4.0, 1.0, 20, 0.7 );
284 glEndList();
285
286 gear2 = glGenLists(1);
287 glNewList(gear2, GL_COMPILE);
289 gear( 0.5, 2.0, 2.0, 10, 0.7 );
290 glEndList();
291
292 gear3 = glGenLists(1);
293 glNewList(gear3, GL_COMPILE);
295 gear( 1.3, 2.0, 0.5, 10, 0.7 );
296 glEndList();
297
299}
300
301int main(int argc, char **argv)
302{
303 if (argc>1) {
304 /* do 'n' frames then exit */
305 limit = atoi( argv[1] ) + 1;
306 }
307 else {
308 limit = 0;
309 }
310
311 return ui_loop(argc, argv, "gears");
312}
313
314
void glVertex3f(float x, float y, float z)
Definition: api.c:23
void glNormal3f(float x, float y, float z)
Definition: api.c:35
void idle(void)
Definition: gears.c:203
GLenum key(int k, GLenum mask)
Definition: gears.c:212
void init(void)
Definition: gears.c:257
int main(int argc, char **argv)
Definition: gears.c:301
void reshape(int width, int height)
Definition: gears.c:242
void draw(void)
Definition: gears.c:163
#define M_PI
Definition: gears.c:24
void glFrustum(double left, double right, double bottom, double top, double near, double far)
Definition: api.c:354
@ GL_NORMALIZE
Definition: gl.h:191
@ GL_QUAD_STRIP
Definition: gl.h:40
@ GL_FALSE
Definition: gl.h:15
@ GL_TRUE
Definition: gl.h:16
@ GL_COMPILE
Definition: gl.h:134
@ GL_SMOOTH
Definition: gl.h:187
@ GL_CULL_FACE
Definition: gl.h:121
@ GL_LIGHT0
Definition: gl.h:159
@ GL_DEPTH_TEST
Definition: gl.h:149
@ GL_PROJECTION
Definition: gl.h:95
@ GL_POSITION
Definition: gl.h:177
@ GL_QUADS
Definition: gl.h:39
@ GL_LIGHTING
Definition: gl.h:158
@ GL_MODELVIEW
Definition: gl.h:94
@ GL_FRONT
Definition: gl.h:119
@ GL_AMBIENT_AND_DIFFUSE
Definition: gl.h:179
@ GL_FLAT
Definition: gl.h:186
unsigned int glGenLists(int range)
Definition: list.c:233
int GLenum
Definition: gl.h:662
void glPushMatrix(void)
Definition: api.c:285
void glPopMatrix(void)
Definition: api.c:294
void glCallList(unsigned int list)
Definition: api.c:635
void glEndList(void)
Definition: list.c:210
float GLfloat
Definition: gl.h:671
void glClearColor(float r, float g, float b, float a)
Definition: api.c:481
void glShadeModel(int mode)
Definition: api.c:140
void glViewport(int x, int y, int width, int height)
Definition: api.c:341
int GLint
Definition: gl.h:667
void glClear(int mask)
Definition: api.c:471
void glNewList(unsigned int list, int mode)
Definition: list.c:191
void glMatrixMode(int mode)
Definition: api.c:244
void glLightfv(int light, int type, float *v)
Definition: api.c:415
void glMaterialfv(int mode, int type, float *v)
Definition: api.c:372
void glRotatef(float angle, float x, float y, float z)
Definition: api.c:303
unsigned int GLuint
Definition: gl.h:670
void glBegin(int type)
Definition: api.c:223
void glTranslatef(float x, float y, float z)
Definition: api.c:316
void glLoadIdentity(void)
Definition: api.c:265
void glEnable(int code)
Definition: api.c:199
@ GL_COLOR_BUFFER_BIT
Definition: gl.h:651
@ GL_DEPTH_BUFFER_BIT
Definition: gl.h:645
void glEnd(void)
Definition: api.c:233
int ui_loop(int argc, char **argv, const char *name)
Definition: mingw32.c:310
void tkSwapBuffers(void)
Definition: mingw32.c:305
#define KEY_RIGHT
Definition: ui.h:15
#define KEY_DOWN
Definition: ui.h:13
#define KEY_ESCAPE
Definition: ui.h:16
#define KEY_LEFT
Definition: ui.h:14
#define KEY_UP
Definition: ui.h:12