changes towards GL_ARB_point_sprite (two-zero)
authorDaniel Borca <dborca@users.sourceforge.net>
Mon, 13 Sep 2004 08:47:01 +0000 (08:47 +0000)
committerDaniel Borca <dborca@users.sourceforge.net>
Mon, 13 Sep 2004 08:47:01 +0000 (08:47 +0000)
progs/demos/spriteblast.c
src/mesa/main/attrib.c
src/mesa/main/get.c
src/mesa/main/mtypes.h
src/mesa/main/points.c
src/mesa/swrast/s_pointtemp.h

index f1eee697242b85629103b50afc5357050809fc0b..4e1d86cdd08625c497ffb4d4ec51cbf4fce03ddd 100644 (file)
@@ -56,7 +56,7 @@ static GLfloat pointTime[MAX_POINTS];
 static GLfloat pointVelocity[MAX_POINTS][2];
 static GLfloat pointDirection[MAX_POINTS][2];
 static int colorList[MAX_POINTS];
-static int animate = 1, motion = 0;
+static int animate = 1, motion = 0, org = 0, sprite = 1, smooth = 1;
 
 static GLfloat colorSet[][4] = {
   /* Shades of red. */
@@ -240,17 +240,19 @@ redraw(void)
   if (blend)
      glEnable(GL_BLEND);
 
-  glEnable(GL_TEXTURE_2D);
+  if (sprite) {
+     glEnable(GL_TEXTURE_2D);
 #ifdef GL_ARB_point_sprite
-  glEnable(GL_POINT_SPRITE_ARB);
+     glEnable(GL_POINT_SPRITE_ARB);
 #endif
+  }
 
   glColor3f(1,1,1);
   glBegin(GL_POINTS);
     for (i=0; i<numPoints; i++) {
       /* Draw alive particles. */
       if (colorList[i] != DEAD) {
-         /*glColor4fv(colorSet[colorList[i]]);*/
+        if (!sprite) glColor4fv(colorSet[colorList[i]]);
         glVertex3fv(pointList[i]);
       }
     }
@@ -326,9 +328,11 @@ menu(int option)
 #endif
   case 8:
     glEnable(GL_POINT_SMOOTH);
+    smooth = 1;
     break;
   case 9:
     glDisable(GL_POINT_SMOOTH);
+    smooth = 0;
     break;
   case 10:
     glPointSize(4.0);
@@ -383,6 +387,47 @@ key(unsigned char c, int x, int y)
     makePointList();
     glutIdleFunc(idle);
     break;
+  case 'o':
+  case 'O':
+    org ^= 1;
+#if GL_VERSION_2_0
+#if GL_ARB_point_parameters
+    glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN,
+                      org ? GL_LOWER_LEFT : GL_UPPER_LEFT);
+#endif
+#endif
+    glutPostRedisplay();
+    break;
+  case 't':
+  case 'T':
+    sprite ^= 1;
+    glutPostRedisplay();
+    break;
+  case 's':
+  case 'S':
+    (smooth ^= 1) ? glEnable(GL_POINT_SMOOTH) : glDisable(GL_POINT_SMOOTH);
+    glutPostRedisplay();
+    break;
+  case '0':
+    glPointSize(1.0);
+    glutPostRedisplay();
+    break;
+  case '1':
+    glPointSize(2.0);
+    glutPostRedisplay();
+    break;
+  case '2':
+    glPointSize(4.0);
+    glutPostRedisplay();
+    break;
+  case '3':
+    glPointSize(8.0);
+    glutPostRedisplay();
+    break;
+  case '4':
+    glPointSize(16.0);
+    glutPostRedisplay();
+    break;
   case 27:
     exit(0);
   }
index 339c40b9bdd5235eae40c21e2fb78b2d383ba4c3..dabb622ce08f3143cb1471f1c68a41565baab1c0 100644 (file)
@@ -1017,6 +1017,10 @@ _mesa_PopAttrib(void)
                   _mesa_set_enable(ctx, GL_POINT_SPRITE_NV,point->PointSprite);
                   _mesa_PointParameteriNV(GL_POINT_SPRITE_R_MODE_NV,
                                           ctx->Point.SpriteRMode);
+#if GL_VERSION_2_0
+                  _mesa_PointParameterfEXT(GL_POINT_SPRITE_COORD_ORIGIN,
+                                           (GLfloat)ctx->Point.SpriteOrigin);
+#endif
                }
             }
             break;
index 38ae4df85be316c30221e1a752ee6dac62c31e52..aaff7176f9f042fef5bf093260337ef182c47858 100644 (file)
@@ -1390,6 +1390,12 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          CHECK_EXTENSION_B(NV_point_sprite, pname);
          *params = ENUM_TO_BOOL(ctx->Point.SpriteRMode);
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         CHECK_EXTENSION_B(ARB_point_sprite, pname);
+         *params = ENUM_TO_BOOL(ctx->Point.SpriteOrigin);
+         break;
+#endif
 
       /* GL_SGIS_generate_mipmap */
       case GL_GENERATE_MIPMAP_HINT_SGIS:
@@ -2942,6 +2948,12 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          CHECK_EXTENSION_D(NV_point_sprite, pname);
          *params = (GLdouble) ctx->Point.SpriteRMode;
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         CHECK_EXTENSION_D(ARB_point_sprite, pname);
+         *params = (GLdouble) ctx->Point.SpriteOrigin;
+         break;
+#endif
 
       /* GL_SGIS_generate_mipmap */
       case GL_GENERATE_MIPMAP_HINT_SGIS:
@@ -4468,6 +4480,12 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          CHECK_EXTENSION_F(NV_point_sprite, pname);
          *params = (GLfloat) ctx->Point.SpriteRMode;
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         CHECK_EXTENSION_F(ARB_point_sprite, pname);
+         *params = (GLfloat) ctx->Point.SpriteOrigin;
+         break;
+#endif
 
       /* GL_SGIS_generate_mipmap */
       case GL_GENERATE_MIPMAP_HINT_SGIS:
@@ -6032,6 +6050,12 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          CHECK_EXTENSION_I(NV_point_sprite, pname);
          *params = (GLint) ctx->Point.SpriteRMode;
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         CHECK_EXTENSION_I(ARB_point_sprite, pname);
+         *params = (GLint) ctx->Point.SpriteOrigin;
+         break;
+#endif
 
       /* GL_SGIS_generate_mipmap */
       case GL_GENERATE_MIPMAP_HINT_SGIS:
index 8fe8831e906e5be537b46f18abe9b355f832d4b6..ba32faad7037bdf82d9ac506e90df399e1d57bb3 100644 (file)
@@ -890,6 +890,7 @@ struct gl_point_attrib {
    GLboolean PointSprite;      /**< GL_NV_point_sprite / GL_NV_point_sprite */
    GLboolean CoordReplace[MAX_TEXTURE_UNITS]; /**< GL_NV_point_sprite / GL_NV_point_sprite */
    GLenum SpriteRMode;         /**< GL_NV_point_sprite (only!) */
+   GLenum SpriteOrigin;                /**< GL_ARB_point_sprite */
 };
 
 
index cbb91554a1e35c1bfa496f7b60afb0c16ac6fc4f..5f5e01039c6922d25c7a866032e6e346cb8be3c1 100644 (file)
@@ -229,6 +229,27 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
             return;
          }
          break;
+#if GL_VERSION_2_0
+      case GL_POINT_SPRITE_COORD_ORIGIN:
+         if (ctx->Extensions.ARB_point_sprite) {
+            GLenum value = (GLenum) params[0];
+            if (value != GL_LOWER_LEFT && value != GL_UPPER_LEFT) {
+               _mesa_error(ctx, GL_INVALID_VALUE,
+                           "glPointParameterf[v]{EXT,ARB}(param)");
+               return;
+            }
+            if (ctx->Point.SpriteOrigin == value)
+               return;
+            FLUSH_VERTICES(ctx, _NEW_POINT);
+            ctx->Point.SpriteOrigin = value;
+         }
+         else {
+            _mesa_error(ctx, GL_INVALID_ENUM,
+                        "glPointParameterf[v]{EXT,ARB}(pname)");
+            return;
+         }
+         break;
+#endif
       default:
          _mesa_error( ctx, GL_INVALID_ENUM,
                       "glPointParameterf[v]{EXT,ARB}(pname)" );
@@ -266,6 +287,9 @@ void _mesa_init_point( GLcontext * ctx )
    ctx->Point.Threshold = 1.0;
    ctx->Point.PointSprite = GL_FALSE; /* GL_ARB_point_sprite / GL_NV_point_sprite */
    ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite (only!) */
+#if GL_VERSION_2_0
+   ctx->Point.SpriteOrigin = GL_UPPER_LEFT; /* GL_ARB_point_sprite */
+#endif
    for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
       ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_ARB_point_sprite / GL_NV_point_sprite */
    }
index 3686e6a72e826cfe45bd72df91456b3d0d7054e2..1cfdf002afd79016d5bfe23b7f440f6891de5e06 100644 (file)
@@ -292,7 +292,13 @@ NAME ( GLcontext *ctx, const SWvertex *vert )
                if (ctx->Texture.Unit[u]._ReallyEnabled) {
                   if (ctx->Point.CoordReplace[u]) {
                      GLfloat s = 0.5F + (x + 0.5F - vert->win[0]) / size;
-                     GLfloat t = 0.5F - (y + 0.5F - vert->win[1]) / size;
+                     GLfloat t;
+#if GL_VERSION_2_0
+                     if (ctx->Point.SpriteOrigin == GL_LOWER_LEFT)
+                        t = 0.5F + (y + 0.5F - vert->win[1]) / size;
+                     else /* GL_UPPER_LEFT */
+#endif
+                        t = 0.5F - (y + 0.5F - vert->win[1]) / size;
                      span->array->texcoords[u][count][0] = s;
                      span->array->texcoords[u][count][1] = t;
                      span->array->texcoords[u][count][3] = 1.0F;