diff options
Diffstat (limited to 'progs')
| -rw-r--r-- | progs/tests/arbnpot.c | 174 | 
1 files changed, 174 insertions, 0 deletions
| diff --git a/progs/tests/arbnpot.c b/progs/tests/arbnpot.c new file mode 100644 index 0000000000..ad1376885b --- /dev/null +++ b/progs/tests/arbnpot.c @@ -0,0 +1,174 @@ +/* + * Test NPOT textures with the GL_ARB_texture_non_power_of_two extension. + * Brian Paul + * 2 July 2003 + */ + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glut.h> +#include "../util/readtex.c" + +#define IMAGE_FILE "../images/girl.rgb" + +static GLfloat Zrot = 0; + +static void Display( void ) +{ +   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + +   glPushMatrix(); +   glRotatef(Zrot, 0, 0, 1); +   glBegin(GL_POLYGON); +   glTexCoord2f(0, 0); +   glVertex2f(-1, -1); +   glTexCoord2f(1, 0); +   glVertex2f(1, -1); +   glTexCoord2f(1, 1); +   glVertex2f(1, 1); +   glTexCoord2f(0, 1); +   glVertex2f(-1, 1); +   glEnd(); +   glPopMatrix(); + +   glutSwapBuffers(); +} + + +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 ); +   glMatrixMode( GL_MODELVIEW ); +   glLoadIdentity(); +   glTranslatef( 0.0, 0.0, -7.0 ); +} + + +static void Key( unsigned char key, int x, int y ) +{ +   (void) x; +   (void) y; +   switch (key) { +      case 'z': +         Zrot -= 1.0; +         break; +      case 'Z': +         Zrot += 1.0; +         break; +      case 27: +         exit(0); +         break; +   } +   glutPostRedisplay(); +} + + +static void Init( void ) +{ +   GLubyte *image; +   int imgWidth, imgHeight, minDim, w; +   GLenum imgFormat; + +   if (!glutExtensionSupported("GL_ARB_texture_non_power_of_two")) { +      printf("Sorry, this program requires GL_ARB_texture_non_power_of_two\n"); +      exit(1); +   } + +#if 1 +   image = LoadRGBImage( IMAGE_FILE, &imgWidth, &imgHeight, &imgFormat ); +   if (!image) { +      printf("Couldn't read %s\n", IMAGE_FILE); +      exit(0); +   } +#else +   int i, j; +   imgFormat = GL_RGB; +   imgWidth = 3; +   imgHeight = 3; +   image = malloc(imgWidth * imgHeight * 3); +   for (i = 0; i < imgHeight; i++) { +      for (j = 0; j < imgWidth; j++) { +         int k = (i * imgWidth + j) * 3; +         if ((i + j) & 1) { +            image[k+0] = 255; +            image[k+1] = 0; +            image[k+2] = 0; +         } +         else { +            image[k+0] = 0; +            image[k+1] = 255; +            image[k+2] = 0; +         } +      } +   } +#endif + +   printf("Read %d x %d\n", imgWidth, imgHeight); + +   minDim = imgWidth < imgHeight ? imgWidth : imgHeight; + +   glPixelStorei(GL_UNPACK_ALIGNMENT, 1); +   glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, imgWidth, 0, +                imgFormat, GL_UNSIGNED_BYTE, image); +   assert(glGetError() == GL_NO_ERROR); + +   glTexImage1D(GL_PROXY_TEXTURE_1D, 0, GL_RGB, imgWidth, 0, +                imgFormat, GL_UNSIGNED_BYTE, image); +   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_1D, 0, GL_TEXTURE_WIDTH, &w); +   assert(w == imgWidth); + +   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imgWidth, imgHeight, 0, +                imgFormat, GL_UNSIGNED_BYTE, image); +   assert(glGetError() == GL_NO_ERROR); + +   glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGB, imgWidth, imgHeight, 0, +                imgFormat, GL_UNSIGNED_BYTE, image); +   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); +   assert(w == imgWidth); + +   glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, imgWidth, imgHeight, 1, 0, +                imgFormat, GL_UNSIGNED_BYTE, image); +   assert(glGetError() == GL_NO_ERROR); + +   glTexImage3D(GL_PROXY_TEXTURE_3D, 0, GL_RGB, imgWidth, imgHeight, 1, 0, +                imgFormat, GL_UNSIGNED_BYTE, image); +   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &w); +   assert(w == imgWidth); + +   glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, +                minDim, minDim, 0, +                imgFormat, GL_UNSIGNED_BYTE, image); +   assert(glGetError() == GL_NO_ERROR); + +   glTexImage2D(GL_PROXY_TEXTURE_CUBE_MAP, 0, GL_RGB, +                minDim, minDim, 0, +                imgFormat, GL_UNSIGNED_BYTE, image); +   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_CUBE_MAP, 0, GL_TEXTURE_WIDTH, &w); +   assert(w == minDim); + + +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); +   glEnable(GL_TEXTURE_2D); +} + + +int main( int argc, char *argv[] ) +{ +   glutInit( &argc, argv ); +   glutInitWindowPosition( 0, 0 ); +   glutInitWindowSize( 40, 40 ); +   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); +   glutCreateWindow(argv[0]); +   glutReshapeFunc( Reshape ); +   glutKeyboardFunc( Key ); +   glutDisplayFunc( Display ); +   Init(); +   glutMainLoop(); +   return 0; +} | 
