i965: add support for ARB_half_float_vertex
[mesa.git] / progs / demos / ipers.c
index 8993d3fc2221497001d6df42fe94adf34d280476..265378b90a9b883b4c2770c165859ca5a84c8cad 100644 (file)
@@ -9,16 +9,16 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
-#include <time.h>
+#include <string.h>
 
-#ifdef WIN32
+#if defined (WIN32)|| defined(_WIN32)
 #include <windows.h>
 #include <mmsystem.h>
 #endif
 
 #include <GL/glut.h>
 
-#include "../util/readtex.c"
+#include "readtex.h"
 
 #ifdef XMESA
 #include "GL/xmesa.h"
@@ -28,6 +28,9 @@ static int fullscreen = 1;
 static int WIDTH = 640;
 static int HEIGHT = 480;
 
+static GLint T0;
+static GLint Frames;
+
 #define MAX_LOD 9
 
 #define TEX_SKY_WIDTH 256
@@ -130,6 +133,8 @@ initdlists(void)
 
       glEndList();
    }
+
+   gluDeleteQuadric(obj);
 }
 
 static void
@@ -183,7 +188,7 @@ inittextures(void)
        (gluerr =
        gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TEX_SKY_WIDTH, TEX_SKY_HEIGHT,
                          GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *) (tsky)))) {
-      fprintf(stderr, "GLULib%s\n", gluErrorString(gluerr));
+      fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
       exit(-1);
    }
 
@@ -195,21 +200,6 @@ inittextures(void)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 }
 
-static float
-gettime(void)
-{
-   static clock_t told = 0;
-   clock_t tnew, ris;
-
-   tnew = clock();
-
-   ris = tnew - told;
-
-   told = tnew;
-
-   return (ris / (float) CLOCKS_PER_SEC);
-}
-
 static void
 calcposobs(void)
 {
@@ -217,6 +207,13 @@ calcposobs(void)
    dir[1] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
    dir[2] = cos(beta * M_PI / 180.0);
 
+   if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
+      dir[0] = 0;
+   if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
+      dir[1] = 0;
+   if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
+      dir[2] = 0;
+
    obs[0] += v * dir[0];
    obs[1] += v * dir[1];
    obs[2] += v * dir[2];
@@ -241,11 +238,28 @@ special(int k, int x, int y)
    }
 }
 
+static void
+cleanup(void)
+{
+   int i;
+
+   glDeleteTextures(1, &t1id);
+   glDeleteTextures(1, &t2id);
+
+   glDeleteLists(skydlist, 1);
+   for (i = 0; i < MAX_LOD; i++) {
+      glDeleteLists(LODdlist[i], 1);
+      glDeleteLists(LODnumpoly[i], 1);
+   }
+}
+
+
 static void
 key(unsigned char k, int x, int y)
 {
    switch (k) {
    case 27:
+      cleanup();
       exit(0);
       break;
 
@@ -362,7 +376,7 @@ printhelp(void)
    printstring(GLUT_BITMAP_TIMES_ROMAN_24, "p - Toggle Wire frame");
    glRasterPos2i(60, 150);
    printstring(GLUT_BITMAP_TIMES_ROMAN_24,
-              "b - Toggle GL_EXT_rescale_normal extension");
+              "n - Toggle GL_EXT_rescale_normal extension");
    glRasterPos2i(60, 120);
    printstring(GLUT_BITMAP_TIMES_ROMAN_24,
               "+/- - Increase/decrease the Object maximum LOD");
@@ -544,11 +558,16 @@ drawipers(int depth, int from)
 static void
 draw(void)
 {
-   static int count = 0;
-   static char frbuf[80];
+   static char frbuf[80] = "";
    static GLfloat alpha = 0.0f;
    static GLfloat beta = 0.0f;
-   float fr;
+   static float fr = 0.0;
+   static double t0 = -1.;
+   double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+   if (t0 < 0.0)
+      t0 = t;
+   dt = t - t0;
+   t0 = t;
 
    dojoy();
 
@@ -592,8 +611,8 @@ draw(void)
    drawipers(0, FROM_NONE);
    glPopMatrix();
 
-   alpha += 0.5f;
-   beta += 0.3f;
+   alpha += 4.f * dt;
+   beta += 2.4f * dt;
 
    glDisable(GL_LIGHTING);
    glDisable(GL_LIGHT0);
@@ -610,10 +629,9 @@ draw(void)
 
    /* Help Screen */
 
-   fr = gettime();
    sprintf(frbuf,
           "Frame rate: %0.2f   LOD: %d   Tot. poly.: %d   Poly/sec: %.1f",
-          1.0 / fr, LODbias, totpoly, totpoly / fr);
+          fr, LODbias, totpoly, totpoly * fr);
 
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_FOG);
@@ -644,7 +662,16 @@ draw(void)
 
    glutSwapBuffers();
 
-   count++;
+   Frames++;
+   {
+      GLint t = glutGet(GLUT_ELAPSED_TIME);
+      if (t - T0 >= 2000) {
+         GLfloat seconds = (t - T0) / 1000.0;
+         fr = Frames / seconds;
+         T0 = t;
+         Frames = 0;
+      }
+   }
 }
 
 int
@@ -655,7 +682,6 @@ main(int ac, char **av)
    fprintf(stderr,
           "IperS V1.0\nWritten by David Bucciarelli (tech.hmw@plus.it)\n");
 
-   glutInitWindowPosition(0, 0);
    glutInitWindowSize(WIDTH, HEIGHT);
    glutInit(&ac, av);
 
@@ -699,6 +725,7 @@ main(int ac, char **av)
    glutIdleFunc(draw);
 
    glutMainLoop();
+   cleanup();
 
    return 0;
 }