mesa: more test options in progs/demos/textures.c
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 20 Oct 2008 23:43:05 +0000 (17:43 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 20 Oct 2008 23:43:05 +0000 (17:43 -0600)
progs/demos/textures.c

index 9f116046359e30996fc462a8e4714c28fc3ffa56..b7bf135d21905b21e65a1658cb8f36695d40981a 100644 (file)
@@ -9,6 +9,9 @@
 #include <GL/glut.h>
 #include "readtex.h"
 
+#define TEST_CLAMP 0
+#define TEST_MIPMAPS 0
+
 #define MAX_TEXTURES 8
 
 
@@ -16,7 +19,8 @@ static int Win;
 static GLfloat Xrot = 0, Yrot = 0, Zrot = 0;
 static GLboolean Anim = GL_TRUE;
 static GLboolean Blend = GL_FALSE;
-static GLboolean MipMap = 1+GL_FALSE;
+static GLuint Filter = 0;
+static GLboolean Clamp = GL_FALSE;
 
 static GLuint NumTextures;
 static GLuint Textures[MAX_TEXTURES];
@@ -32,6 +36,22 @@ static const char *DefaultFiles[] = {
 };
 
 
+#define NUM_FILTERS 5
+static
+struct filter {
+   GLenum min, mag;
+   const char *name;
+} FilterModes[NUM_FILTERS] = {
+   { GL_NEAREST, GL_NEAREST, "Nearest,Nearest" },
+   { GL_LINEAR, GL_LINEAR, "Linear,Linear" },
+   { GL_NEAREST_MIPMAP_NEAREST, GL_NEAREST, "NearestMipmapNearest,Nearest" },
+   { GL_LINEAR_MIPMAP_NEAREST, GL_LINEAR, "LinearMipmapNearest,Linear" },
+   { GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, "LinearMipmapLinear,Linear" }
+};
+
+
+
+
 static void
 Idle(void)
 {
@@ -58,10 +78,17 @@ DrawTextures(void)
 
       glBindTexture(GL_TEXTURE_2D, Textures[i]);
       glBegin(GL_POLYGON);
+#if TEST_CLAMP
+      glTexCoord2f( -0.5, -0.5 );   glVertex2f( -ar, -1.0 );
+      glTexCoord2f(  1.5, -0.5 );   glVertex2f(  ar, -1.0 );
+      glTexCoord2f(  1.5,  1.5 );   glVertex2f(  ar,  1.0 );
+      glTexCoord2f( -0.5,  1.5 );   glVertex2f( -ar,  1.0 );
+#else
       glTexCoord2f( 0.0, 0.0 );   glVertex2f( -ar, -1.0 );
       glTexCoord2f( 1.0, 0.0 );   glVertex2f(  ar, -1.0 );
       glTexCoord2f( 1.0, 1.0 );   glVertex2f(  ar,  1.0 );
       glTexCoord2f( 0.0, 1.0 );   glVertex2f( -ar,  1.0 );
+#endif
       glEnd();
 
       glPopMatrix();
@@ -137,19 +164,23 @@ Randomize(void)
 
 
 static void
-SetTexFilters(void)
+SetTexParams(void)
 {
    GLuint i;
    for (i = 0; i < NumTextures; i++) {
       glBindTexture(GL_TEXTURE_2D, Textures[i]);
-      if (MipMap) {
-         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                         GL_LINEAR_MIPMAP_LINEAR);
-         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                      FilterModes[Filter].min);
+      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
+                      FilterModes[Filter].mag);
+
+      if (Clamp) {
+         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
       }
       else {
-         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
       }
    }
 }
@@ -163,6 +194,7 @@ Key(unsigned char key, int x, int y)
    (void) y;
    switch (key) {
    case 'a':
+   case ' ':
       Anim = !Anim;
       if (Anim)
          glutIdleFunc(Idle);
@@ -172,12 +204,19 @@ Key(unsigned char key, int x, int y)
    case 'b':
       Blend = !Blend;
       break;
-   case 'm':
-      MipMap = !MipMap;
-      SetTexFilters();
+   case 'f':
+      Filter = (Filter + 1) % NUM_FILTERS;
+      SetTexParams();
       break;      
    case 'r':
       Randomize();
+      break;
+#if TEST_CLAMP
+   case 'c':
+      Clamp = !Clamp;
+      SetTexParams();
+      break;
+#endif
    case 'z':
       Zrot -= step;
       break;
@@ -190,9 +229,9 @@ Key(unsigned char key, int x, int y)
       break;
    }
 
-   printf("Blend=%s MipMap=%s\n",
+   printf("Blend=%s Filter=%s\n",
           Blend ? "Y" : "n",
-          MipMap ? "Y" : "n");
+          FilterModes[Filter].name);
 
    glutPostRedisplay();
 }
@@ -231,15 +270,46 @@ LoadTextures(GLuint n, const char *files[])
 
    glGenTextures(n, Textures);
 
+   SetTexParams();
+
    for (i = 0; i < n; i++) {
       GLint w, h;
       glBindTexture(GL_TEXTURE_2D, Textures[i]);
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+#if TEST_MIPMAPS
+      {
+         static const GLubyte color[9][4] = {
+            {255, 0, 0},
+            {0, 255, 0},
+            {0, 0, 255},
+            {0, 255, 255},
+            {255, 0, 255},
+            {255, 255, 0},
+            {255, 128, 255},
+            {128, 128, 128},
+            {64, 64, 64}
+         };
+
+         GLubyte image[256*256*4];
+         int i, level;
+         w = h = 256;
+         for (level = 0; level <= 8; level++) {
+            for (i = 0; i < w * h; i++) {
+               image[i*4+0] = color[level][0];
+               image[i*4+1] = color[level][1];
+               image[i*4+2] = color[level][2];
+               image[i*4+3] = color[level][3];
+            }
+            printf("Load level %d: %d x %d\n", level, w>>level, h>>level);
+            glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, w>>level, h>>level, 0,
+                         GL_RGBA, GL_UNSIGNED_BYTE, image);
+         }
+      }
+#else
       if (!LoadRGBMipmaps2(files[i], GL_TEXTURE_2D, GL_RGB, &w, &h)) {
          printf("Error: couldn't load %s\n", files[i]);
          exit(1);
       }
+#endif
       TexAspect[i] = (float) w / (float) h;
       printf("Loaded %s\n", files[i]);
    }
@@ -277,7 +347,7 @@ Usage(void)
    printf("Keys:\n");
    printf("  a - toggle animation\n");
    printf("  b - toggle blending\n");
-   printf("  m - toggle mipmapping\n");
+   printf("  f - change texture filter mode\n");
    printf("  r - randomize\n");
    printf("  ESC - exit\n");
 }
@@ -288,7 +358,7 @@ main(int argc, char *argv[])
 {
    glutInit(&argc, argv);
    glutInitWindowPosition(0, 0);
-   glutInitWindowSize(400, 400);
+   glutInitWindowSize(700, 700);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    Win = glutCreateWindow(argv[0]);
    glutReshapeFunc(Reshape);