blob: 2f3fa9fd97e954e363fa1bf9b549e5d14ee5d007 [file] [log] [blame]
jtgafb833d1999-08-19 00:55:39 +00001
2/*
Brian Paule7161842000-08-16 20:36:34 +00003 * Bouncing ball demo.
jtgafb833d1999-08-19 00:55:39 +00004 *
5 * This program is in the public domain
6 *
7 * Brian Paul
Brian Paul02e8a032000-06-27 17:04:43 +00008 *
Brian Paule7161842000-08-16 20:36:34 +00009 * Conversion to GLUT by Mark J. Kilgard
jtgafb833d1999-08-19 00:55:39 +000010 */
11
12
13#include <math.h>
14#include <stdlib.h>
15#include <string.h>
16#include <GL/glut.h>
Brian Paul92eddb02005-01-09 17:37:50 +000017#include <sys/time.h>
18#include <time.h>
jtgafb833d1999-08-19 00:55:39 +000019
20#define COS(X) cos( (X) * 3.14159/180.0 )
21#define SIN(X) sin( (X) * 3.14159/180.0 )
22
23#define RED 1
24#define WHITE 2
25#define CYAN 3
26
27GLboolean IndexMode = GL_FALSE;
28GLuint Ball;
29GLenum Mode;
Brian Paul92eddb02005-01-09 17:37:50 +000030GLfloat Zrot = 0.0, Zstep = 180.0;
jtgafb833d1999-08-19 00:55:39 +000031GLfloat Xpos = 0.0, Ypos = 1.0;
Brian Paul92eddb02005-01-09 17:37:50 +000032GLfloat Xvel = 2.0, Yvel = 0.0;
jtgafb833d1999-08-19 00:55:39 +000033GLfloat Xmin = -4.0, Xmax = 4.0;
34GLfloat Ymin = -3.8, Ymax = 4.0;
Brian Paul92eddb02005-01-09 17:37:50 +000035GLfloat G = -9.8;
jtgafb833d1999-08-19 00:55:39 +000036
37static GLuint
38make_ball(void)
39{
40 GLuint list;
41 GLfloat a, b;
42 GLfloat da = 18.0, db = 18.0;
43 GLfloat radius = 1.0;
44 GLuint color;
45 GLfloat x, y, z;
46
47 list = glGenLists(1);
48
49 glNewList(list, GL_COMPILE);
50
51 color = 0;
52 for (a = -90.0; a + da <= 90.0; a += da) {
53
54 glBegin(GL_QUAD_STRIP);
55 for (b = 0.0; b <= 360.0; b += db) {
56
57 if (color) {
58 glIndexi(RED);
59 glColor3f(1, 0, 0);
60 } else {
61 glIndexi(WHITE);
62 glColor3f(1, 1, 1);
63 }
64
Brian Paule7161842000-08-16 20:36:34 +000065 x = radius * COS(b) * COS(a);
66 y = radius * SIN(b) * COS(a);
67 z = radius * SIN(a);
jtgafb833d1999-08-19 00:55:39 +000068 glVertex3f(x, y, z);
69
70 x = radius * COS(b) * COS(a + da);
71 y = radius * SIN(b) * COS(a + da);
72 z = radius * SIN(a + da);
73 glVertex3f(x, y, z);
74
75 color = 1 - color;
76 }
77 glEnd();
78
79 }
80
81 glEndList();
82
83 return list;
84}
85
86static void
87reshape(int width, int height)
88{
89 float aspect = (float) width / (float) height;
90 glViewport(0, 0, (GLint) width, (GLint) height);
91 glMatrixMode(GL_PROJECTION);
92 glLoadIdentity();
93 glOrtho(-6.0 * aspect, 6.0 * aspect, -6.0, 6.0, -6.0, 6.0);
94 glMatrixMode(GL_MODELVIEW);
95}
96
97/* ARGSUSED1 */
98static void
99key(unsigned char k, int x, int y)
100{
101 switch (k) {
102 case 27: /* Escape */
103 exit(0);
104 }
105}
106
107static void
108draw(void)
109{
110 GLint i;
111
112 glClear(GL_COLOR_BUFFER_BIT);
113
114 glIndexi(CYAN);
115 glColor3f(0, 1, 1);
116 glBegin(GL_LINES);
117 for (i = -5; i <= 5; i++) {
118 glVertex2i(i, -5);
119 glVertex2i(i, 5);
120 }
121 for (i = -5; i <= 5; i++) {
122 glVertex2i(-5, i);
123 glVertex2i(5, i);
124 }
125 for (i = -5; i <= 5; i++) {
126 glVertex2i(i, -5);
127 glVertex2f(i * 1.15, -5.9);
128 }
129 glVertex2f(-5.3, -5.35);
130 glVertex2f(5.3, -5.35);
131 glVertex2f(-5.75, -5.9);
132 glVertex2f(5.75, -5.9);
133 glEnd();
134
135 glPushMatrix();
136 glTranslatef(Xpos, Ypos, 0.0);
137 glScalef(2.0, 2.0, 2.0);
138 glRotatef(8.0, 0.0, 0.0, 1.0);
139 glRotatef(90.0, 1.0, 0.0, 0.0);
140 glRotatef(Zrot, 0.0, 0.0, 1.0);
141
142 glCallList(Ball);
143
144 glPopMatrix();
145
146 glFlush();
147 glutSwapBuffers();
148}
149
150static void
151idle(void)
152{
153 static float vel0 = -100.0;
Brian Paul92eddb02005-01-09 17:37:50 +0000154 static double t0 = -1.;
155 double t, dt;
156 t = glutGet(GLUT_ELAPSED_TIME) / 1000.;
157 if (t0 < 0.)
158 t0 = t;
159 dt = t - t0;
160 t0 = t;
jtgafb833d1999-08-19 00:55:39 +0000161
Brian Paul92eddb02005-01-09 17:37:50 +0000162 Zrot += Zstep*dt;
jtgafb833d1999-08-19 00:55:39 +0000163
Brian Paul92eddb02005-01-09 17:37:50 +0000164 Xpos += Xvel*dt;
jtgafb833d1999-08-19 00:55:39 +0000165 if (Xpos >= Xmax) {
166 Xpos = Xmax;
167 Xvel = -Xvel;
168 Zstep = -Zstep;
169 }
170 if (Xpos <= Xmin) {
171 Xpos = Xmin;
172 Xvel = -Xvel;
173 Zstep = -Zstep;
174 }
Brian Paul92eddb02005-01-09 17:37:50 +0000175 Ypos += Yvel*dt;
176 Yvel += G*dt;
jtgafb833d1999-08-19 00:55:39 +0000177 if (Ypos < Ymin) {
178 Ypos = Ymin;
179 if (vel0 == -100.0)
180 vel0 = fabs(Yvel);
181 Yvel = vel0;
182 }
183 glutPostRedisplay();
184}
185
Brian Paul02e8a032000-06-27 17:04:43 +0000186static void
jtgafb833d1999-08-19 00:55:39 +0000187visible(int vis)
188{
189 if (vis == GLUT_VISIBLE)
190 glutIdleFunc(idle);
191 else
192 glutIdleFunc(NULL);
193}
194
195int main(int argc, char *argv[])
196{
197 glutInit(&argc, argv);
198 glutInitWindowPosition(0, 0);
199 glutInitWindowSize(600, 450);
200
201
202 IndexMode = argc > 1 && strcmp(argv[1], "-ci") == 0;
203 if (IndexMode)
204 glutInitDisplayMode(GLUT_INDEX | GLUT_DOUBLE);
205 else
206 glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
207
208 glutCreateWindow("Bounce");
209 Ball = make_ball();
210 glCullFace(GL_BACK);
211 glEnable(GL_CULL_FACE);
212 glDisable(GL_DITHER);
213 glShadeModel(GL_FLAT);
214
215 glutDisplayFunc(draw);
216 glutReshapeFunc(reshape);
217 glutVisibilityFunc(visible);
218 glutKeyboardFunc(key);
219
220 if (IndexMode) {
221 glutSetColor(RED, 1.0, 0.0, 0.0);
222 glutSetColor(WHITE, 1.0, 1.0, 1.0);
223 glutSetColor(CYAN, 0.0, 1.0, 1.0);
224 }
225
226 glutMainLoop();
227 return 0; /* ANSI C requires main to return int. */
228}