animation rate patch (Marcello Magallon)
authorBrian Paul <brian.paul@tungstengraphics.com>
Sun, 9 Jan 2005 16:52:53 +0000 (16:52 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sun, 9 Jan 2005 16:52:53 +0000 (16:52 +0000)
progs/redbook/alpha3D.c
progs/redbook/double.c

index 413836edd5b6ddafffb2a3f59b0a40006c8fb1de..6169bd162beeed3dc67b0e63eb0ae432215dd2d5 100644 (file)
@@ -49,7 +49,7 @@
 
 #define MAXZ 8.0
 #define MINZ -8.0
-#define ZINC 0.4
+#define ZINC 4.
 
 static float solidZ = MAXZ;
 static float transparentZ = MINZ;
@@ -130,11 +130,21 @@ void reshape(int w, int h)
 
 void animate(void)
 {
+   static double t0 = -1.;
    if (solidZ <= MINZ || transparentZ >= MAXZ)
+   {
       glutIdleFunc(NULL);
+      t0 = -1.;
+   }
    else {
-      solidZ -= ZINC;
-      transparentZ += ZINC;
+      double t, dt;
+      t = glutGet(GLUT_ELAPSED_TIME) / 1000.;
+      if (t0 < 0.)
+         t0 = t;
+      dt = t - t0;
+      t0 = t;
+      solidZ -= ZINC*dt;
+      transparentZ += ZINC*dt;
       glutPostRedisplay();
    }
 }
@@ -163,7 +173,7 @@ void keyboard(unsigned char key, int x, int y)
 int main(int argc, char** argv)
 {
    glutInit(&argc, argv);
-   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
+   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow(argv[0]);
    init();
index a41229d12fc4c1631bbb0fb59482f42b235e7b23..3153c70cc1d60c7b99d13ca1d608d1d15e30d165 100644 (file)
@@ -45,6 +45,7 @@
 #include <stdlib.h>
 
 static GLfloat spin = 0.0;
+static GLdouble t0 = 0.;
 
 void display(void)
 {
@@ -58,9 +59,18 @@ void display(void)
    glutSwapBuffers();
 }
 
+GLdouble gettime(void)
+{
+    return (GLdouble)(glutGet(GLUT_ELAPSED_TIME)) / 1000.;
+}
+
 void spinDisplay(void)
 {
-   spin = spin + 2.0;
+   GLdouble t, dt;
+   t = gettime();
+   dt = t - t0;
+   t0 = t;
+   spin = spin + 120.0*dt;
    if (spin > 360.0)
       spin = spin - 360.0;
    glutPostRedisplay();
@@ -88,7 +98,10 @@ void mouse(int button, int state, int x, int y)
    switch (button) {
       case GLUT_LEFT_BUTTON:
          if (state == GLUT_DOWN)
+         {
+            t0 = gettime();
             glutIdleFunc(spinDisplay);
+         }
          break;
       case GLUT_MIDDLE_BUTTON:
          if (state == GLUT_DOWN)