vbo: if 'end' is out of bounds, clamp it
[mesa.git] / progs / demos / spriteblast.c
index 63dc7d12bb8a56c677f15743c65fcb46e3f3c6a1..d73b680b791dfd568a0ef5718a46e17eead88e68 100644 (file)
@@ -21,7 +21,7 @@
 #ifdef _WIN32
 #include <windows.h>
 #endif
-#define GL_GLEXT_PROTOTYPES
+#include <GL/glew.h>
 #include <GL/glut.h>
 
 /* Some <math.h> files do not define M_PI... */
@@ -104,7 +104,6 @@ static float float_rand(void) { return rand() / (float) RAND_MAX; }
 
 #define MEAN_VELOCITY 3.0
 #define GRAVITY 2.0
-#define TIME_DELTA 0.025  /* The speed of time. */
 
 /* Modeling units of ground extent in each X and Z direction. */
 #define EDGE 12
@@ -139,6 +138,13 @@ updatePointList(void)
   float distance;
   int i;
 
+  static double t0 = -1.;
+  double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+  if (t0 < 0.0)
+    t0 = t;
+  dt = t - t0;
+  t0 = t;
+
   motion = 0;
   for (i=0; i<numPoints; i++) {
     distance = pointVelocity[i][0] * theTime;
@@ -164,9 +170,9 @@ updatePointList(void)
       pointTime[i] = 0.0;  /* Reset the particles sense of up time. */
     }
     motion = 1;
-    pointTime[i] += TIME_DELTA;
+    pointTime[i] += dt;
   }
-  theTime += TIME_DELTA;
+  theTime += dt;
   if (!motion && !spin) {
     if (repeat) {
       makePointList();
@@ -203,13 +209,13 @@ redraw(void)
 {
   int i;
 
+  glDepthMask(GL_TRUE);
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glPushMatrix();
   glRotatef(15.0, 1.0, 0.0, 0.0);
   glRotatef(angle, 0.0, 1.0, 0.0);
 
-  glDepthMask(GL_FALSE);
 
   /* Draw the floor. */
 /*  glEnable(GL_TEXTURE_2D);*/
@@ -226,7 +232,7 @@ redraw(void)
   glEnd();
 
   /* Allow particles to blend with each other. */
-  glDepthMask(GL_TRUE);
+  glDepthMask(GL_FALSE);
 
   if (blend)
      glEnable(GL_BLEND);
@@ -327,13 +333,13 @@ menu(int option)
     smooth = 0;
     break;
   case 10:
-    glPointSize(4.0);
+    glPointSize(16.0);
     break;
   case 11:
-    glPointSize(8.0);
+    glPointSize(32.0);
     break;
   case 12:
-    glPointSize(16.0);
+    glPointSize(64.0);
     break;
   case 13:
     spin = 1 - spin;
@@ -405,19 +411,19 @@ key(unsigned char c, int x, int y)
     glutPostRedisplay();
     break;
   case '1':
-    glPointSize(2.0);
+    glPointSize(16.0);
     glutPostRedisplay();
     break;
   case '2':
-    glPointSize(4.0);
+    glPointSize(32.0);
     glutPostRedisplay();
     break;
   case '3':
-    glPointSize(8.0);
+    glPointSize(64.0);
     glutPostRedisplay();
     break;
   case '4':
-    glPointSize(16.0);
+    glPointSize(128.0);
     glutPostRedisplay();
     break;
   case 27:
@@ -503,6 +509,7 @@ main(int argc, char **argv)
   glutInitWindowPosition(0, 0);
   glutInitWindowSize(600,300);
   glutCreateWindow("sprite blast");
+  glewInit();
   glutReshapeFunc(reshape);
   glutDisplayFunc(redraw);
   glutMouseFunc(mouse);
@@ -520,9 +527,9 @@ main(int argc, char **argv)
   glutAddMenuEntry("Threshold 10", 7);
   glutAddMenuEntry("Point smooth on", 8);
   glutAddMenuEntry("Point smooth off", 9);
-  glutAddMenuEntry("Point size 4", 10);
-  glutAddMenuEntry("Point size 8", 11);
-  glutAddMenuEntry("Point size 16", 12);
+  glutAddMenuEntry("Point size 16", 10);
+  glutAddMenuEntry("Point size 32", 11);
+  glutAddMenuEntry("Point size 64", 12);
   glutAddMenuEntry("Toggle spin", 13);
   glutAddMenuEntry("200 points ", 14);
   glutAddMenuEntry("500 points ", 15);
@@ -531,18 +538,18 @@ main(int argc, char **argv)
   glutAddMenuEntry("Quit", 666);
   glutAttachMenu(GLUT_RIGHT_BUTTON);
 
+  makePointList();
+  makeSprite();
+
   glShadeModel(GL_FLAT);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_POINT_SMOOTH);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-  glPointSize(16.0);
+  glPointSize(32.0);
 #ifdef GL_ARB_point_parameters
   glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
 #endif
 
-  makePointList();
-  makeSprite();
-
   glutMainLoop();
   return 0;             /* ANSI C requires main to return int. */
 }