summaryrefslogtreecommitdiffstats
path: root/balls.c
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-02 19:36:40 -0400
committerSam Anthony <sam@samanthony.xyz>2024-11-02 19:36:40 -0400
commit13ccfb3728eb3dc3a6a5294a8f8754b3c5cbc903 (patch)
tree44696026cf15448edba5586b6372e53354d19980 /balls.c
parente88035b16d88308e0604119879e078af7ac56d01 (diff)
downloadballs-13ccfb3728eb3dc3a6a5294a8f8754b3c5cbc903.zip
frame pacing
Diffstat (limited to 'balls.c')
-rw-r--r--balls.c29
1 files changed, 25 insertions, 4 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