summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--balls.c29
-rw-r--r--balls.cl4
2 files changed, 27 insertions, 6 deletions
diff --git a/balls.c b/balls.c
index 8d85a89..384f7c1 100644
--- a/balls.c
+++ b/balls.c
@@ -28,7 +28,13 @@
#define RMAX 0.10 /* Maximum radius. */
#define VMAX_INIT 0.05 /* Maximum initial velocity. */
-enum { WIDTH = 640, HEIGHT = 480 };
+enum {
+ WIDTH = 640,
+ HEIGHT = 640,
+ FPS = 60,
+ MS_PER_S = 1000,
+ FRAME_TIME_MS = MS_PER_S / FPS,
+ };
enum { KEY_QUIT = 'q' };
enum { NBALLS_DEFAULT = 3 };
enum {
@@ -49,6 +55,7 @@ void genVertexBuffer(void);
void setColors(void);
void configSharedData(void);
void setKernelArgs(void);
+void animate(int v);
void display(void);
void reshape(int w, int h);
void keyboard(unsigned char key, int x, int y);
@@ -102,6 +109,7 @@ main(int argc, char *argv[]) {
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
+ glutTimerFunc(0, animate, 0);
glutMainLoop();
@@ -397,13 +405,27 @@ setKernelArgs(void) {
}
void
-display(void) {
- int i;
+animate(int v) {
+ clock_t tstart, elapsed;
+ unsigned int nextFrame;
+
+ tstart = clock();
move();
collideBalls();
collideWalls();
+ display();
+
+ elapsed = (clock() - tstart) / (CLOCKS_PER_SEC / MS_PER_S);
+ nextFrame = (elapsed > FRAME_TIME_MS) ? 0 : FRAME_TIME_MS-elapsed;
+ glutTimerFunc(nextFrame, animate, 0);
+}
+
+void
+display(void) {
+ int i;
+
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
genVertices();
@@ -416,7 +438,6 @@ display(void) {
frameCount();
glutSwapBuffers();
- glutPostRedisplay();
}
void
diff --git a/balls.cl b/balls.cl
index 6d015fb..05d155c 100644
--- a/balls.cl
+++ b/balls.cl
@@ -1,5 +1,5 @@
-#define G_FACTOR 3600.0f
-#define G (9.81f / G_FACTOR)
+#define FPS 60.0f
+#define G (9.81f / FPS / FPS)
#define DENSITY 1500.0f
float mass(float radius);