improved to test alpha blending with texture palette
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 4 Oct 2000 18:15:39 +0000 (18:15 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 4 Oct 2000 18:15:39 +0000 (18:15 +0000)
progs/demos/paltex.c

index aaafc6f..71c2fed 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: paltex.c,v 1.4 2000/06/27 17:12:10 brianp Exp $ */
+/* $Id: paltex.c,v 1.5 2000/10/04 18:15:39 brianp Exp $ */
 
 /*
  * Paletted texture demo.  Written by Brian Paul.
 
 
 static float Rot = 0.0;
+static GLboolean Anim = 1;
 
 
 static void Idle( void )
 {
-   Rot += 5.0;
+   float t = glutGet(GLUT_ELAPSED_TIME) * 0.001;  /* in seconds */
+   Rot = t * 360 / 4;  /* 1 rotation per 4 seconds */
    glutPostRedisplay();
 }
 
 
 static void Display( void )
 {
-   glClear( GL_COLOR_BUFFER_BIT );
+   /* draw background gradient */
+   glDisable(GL_TEXTURE_2D);
+   glBegin(GL_POLYGON);
+   glColor3f(1.0, 0.0, 0.2); glVertex2f(-1.5, -1.0);
+   glColor3f(1.0, 0.0, 0.2); glVertex2f( 1.5, -1.0);
+   glColor3f(0.0, 0.0, 1.0); glVertex2f( 1.5,  1.0);
+   glColor3f(0.0, 0.0, 1.0); glVertex2f(-1.5,  1.0);
+   glEnd();
 
    glPushMatrix();
    glRotatef(Rot, 0, 0, 1);
 
+   glEnable(GL_TEXTURE_2D);
    glBegin(GL_POLYGON);
    glTexCoord2f(0, 1);  glVertex2f(-1, -0.5);
    glTexCoord2f(1, 1);  glVertex2f( 1, -0.5);
@@ -47,10 +57,9 @@ static void Reshape( int width, int height )
    glViewport( 0, 0, width, height );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
-   glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
+   glOrtho( -1.5, 1.5, -1.0, 1.0, -1.0, 1.0 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
-   glTranslatef( 0.0, 0.0, -7.0 );
 }
 
 
@@ -62,6 +71,16 @@ static void Key( unsigned char key, int x, int y )
       case 27:
          exit(0);
          break;
+      case 's':
+         Rot += 0.5;
+         break;
+      case ' ':
+         Anim = !Anim;
+         if (Anim)
+            glutIdleFunc( Idle );
+         else
+            glutIdleFunc( NULL );
+         break;
    }
    glutPostRedisplay();
 }
@@ -89,26 +108,27 @@ static void Init( void )
    }
 
    /* load the color table for each texel-index */
-   table[' '][0] = 50;
-   table[' '][1] = 50;
-   table[' '][2] = 50;
-   table[' '][3] = 50;
+   memset(table, 0, 256*4);
+   table[' '][0] = 255;
+   table[' '][1] = 255;
+   table[' '][2] = 255;
+   table[' '][3] = 64;
    table['M'][0] = 255;
    table['M'][1] = 0;
    table['M'][2] = 0;
-   table['M'][3] = 0;
+   table['M'][3] = 255;
    table['E'][0] = 0;
    table['E'][1] = 255;
    table['E'][2] = 0;
-   table['E'][3] = 0;
-   table['S'][0] = 40;
-   table['S'][1] = 40;
+   table['E'][3] = 255;
+   table['S'][0] = 0;
+   table['S'][1] = 0;
    table['S'][2] = 255;
-   table['S'][3] = 0;
+   table['S'][3] = 255;
    table['A'][0] = 255;
    table['A'][1] = 255;
    table['A'][2] = 0;
-   table['A'][3] = 0;
+   table['A'][3] = 255;
 
 #ifdef GL_EXT_paletted_texture
 
@@ -144,6 +164,81 @@ static void Init( void )
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    glEnable(GL_TEXTURE_2D);
+
+   glEnable(GL_BLEND);
+   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+#undef HEIGHT 32
+#undef WIDTH 256
+}
+
+
+
+/*
+ * Color ramp test
+ */
+static void Init2( void )
+{
+#define HEIGHT 32
+#define WIDTH 256
+   static char texture[HEIGHT][WIDTH];
+   GLubyte table[256][4];
+   int i, j;
+
+   if (!glutExtensionSupported("GL_EXT_paletted_texture")) {
+      printf("Sorry, GL_EXT_paletted_texture not supported\n");
+      exit(0);
+   }
+
+   for (j = 0; j < HEIGHT; j++) {
+      for (i = 0; i < WIDTH; i++) {
+         texture[j][i] = i;
+      }
+   }
+
+   for (i = 0; i < 255; i++) {
+      table[i][0] = i;
+      table[i][1] = 0;
+      table[i][2] = 0;
+      table[i][3] = 255;
+   }
+
+#ifdef GL_EXT_paletted_texture
+
+#if defined(GL_EXT_shared_texture_palette) && defined(USE_SHARED_PALETTE)
+   printf("Using shared palette\n");
+   glColorTableEXT(GL_SHARED_TEXTURE_PALETTE_EXT,    /* target */
+                   GL_RGBA,          /* internal format */
+                   256,              /* table size */
+                   GL_RGBA,          /* table format */
+                   GL_UNSIGNED_BYTE, /* table type */
+                   table);           /* the color table */
+   glEnable(GL_SHARED_TEXTURE_PALETTE_EXT);
+#else
+   glColorTableEXT(GL_TEXTURE_2D,    /* target */
+                   GL_RGBA,          /* internal format */
+                   256,              /* table size */
+                   GL_RGBA,          /* table format */
+                   GL_UNSIGNED_BYTE, /* table type */
+                   table);           /* the color table */
+#endif
+
+   glTexImage2D(GL_TEXTURE_2D,       /* target */
+                0,                   /* level */
+                GL_COLOR_INDEX8_EXT, /* internal format */
+                WIDTH, HEIGHT,       /* width, height */
+                0,                   /* border */
+                GL_COLOR_INDEX,      /* texture format */
+                GL_UNSIGNED_BYTE,    /* texture type */
+                texture);            /* teh texture */
+#endif
+
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+   glEnable(GL_TEXTURE_2D);
+
+   glEnable(GL_BLEND);
+   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 }
 
 
@@ -151,7 +246,7 @@ int main( int argc, char *argv[] )
 {
    glutInit( &argc, argv );
    glutInitWindowPosition( 0, 0 );
-   glutInitWindowSize( 400, 400 );
+   glutInitWindowSize( 400, 300 );
 
    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
 
@@ -162,7 +257,8 @@ int main( int argc, char *argv[] )
    glutReshapeFunc( Reshape );
    glutKeyboardFunc( Key );
    glutDisplayFunc( Display );
-   glutIdleFunc( Idle );
+   if (Anim)
+      glutIdleFunc( Idle );
 
    glutMainLoop();
    return 0;