132001f49Smrg/*
232001f49Smrg * Test NPOT textures with the GL_ARB_texture_non_power_of_two extension.
332001f49Smrg * Brian Paul
432001f49Smrg * 2 July 2003
532001f49Smrg */
632001f49Smrg
732001f49Smrg#include <assert.h>
832001f49Smrg#include <stdio.h>
932001f49Smrg#include <stdlib.h>
1032001f49Smrg#include <math.h>
1132001f49Smrg#include <GL/glew.h>
1232001f49Smrg#include "glut_wrap.h"
1332001f49Smrg#include "../util/readtex.c"
1432001f49Smrg
1532001f49Smrg#define IMAGE_FILE DEMOS_DATA_DIR "girl.rgb"
1632001f49Smrg
1732001f49Smrgstatic GLfloat Zrot = 0;
1832001f49Smrg
1932001f49Smrgstatic void Display( void )
2032001f49Smrg{
2132001f49Smrg   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
2232001f49Smrg
2332001f49Smrg   glPushMatrix();
2432001f49Smrg   glRotatef(Zrot, 0, 0, 1);
2532001f49Smrg   glBegin(GL_POLYGON);
2632001f49Smrg   glTexCoord2f(0, 0);
2732001f49Smrg   glVertex2f(-1, -1);
2832001f49Smrg   glTexCoord2f(1, 0);
2932001f49Smrg   glVertex2f(1, -1);
3032001f49Smrg   glTexCoord2f(1, 1);
3132001f49Smrg   glVertex2f(1, 1);
3232001f49Smrg   glTexCoord2f(0, 1);
3332001f49Smrg   glVertex2f(-1, 1);
3432001f49Smrg   glEnd();
3532001f49Smrg   glPopMatrix();
3632001f49Smrg
3732001f49Smrg   glutSwapBuffers();
3832001f49Smrg}
3932001f49Smrg
4032001f49Smrg
4132001f49Smrgstatic void Reshape( int width, int height )
4232001f49Smrg{
4332001f49Smrg   glViewport( 0, 0, width, height );
4432001f49Smrg   glMatrixMode( GL_PROJECTION );
4532001f49Smrg   glLoadIdentity();
4632001f49Smrg   glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
4732001f49Smrg   glMatrixMode( GL_MODELVIEW );
4832001f49Smrg   glLoadIdentity();
4932001f49Smrg   glTranslatef( 0.0, 0.0, -7.0 );
5032001f49Smrg}
5132001f49Smrg
5232001f49Smrg
5332001f49Smrgstatic void Key( unsigned char key, int x, int y )
5432001f49Smrg{
5532001f49Smrg   (void) x;
5632001f49Smrg   (void) y;
5732001f49Smrg   switch (key) {
5832001f49Smrg      case 'z':
5932001f49Smrg         Zrot -= 1.0;
6032001f49Smrg         break;
6132001f49Smrg      case 'Z':
6232001f49Smrg         Zrot += 1.0;
6332001f49Smrg         break;
6432001f49Smrg      case 27:
6532001f49Smrg         exit(0);
6632001f49Smrg         break;
6732001f49Smrg   }
6832001f49Smrg   glutPostRedisplay();
6932001f49Smrg}
7032001f49Smrg
7132001f49Smrg
7232001f49Smrgstatic void Init( void )
7332001f49Smrg{
7432001f49Smrg   GLubyte *image;
7532001f49Smrg   int imgWidth, imgHeight, minDim, w;
7632001f49Smrg   GLenum imgFormat;
7732001f49Smrg
7832001f49Smrg   if (!glutExtensionSupported("GL_ARB_texture_non_power_of_two")) {
7932001f49Smrg      printf("Sorry, this program requires GL_ARB_texture_non_power_of_two\n");
8032001f49Smrg      exit(1);
8132001f49Smrg   }
8232001f49Smrg
8332001f49Smrg#if 1
8432001f49Smrg   image = LoadRGBImage( IMAGE_FILE, &imgWidth, &imgHeight, &imgFormat );
8532001f49Smrg   if (!image) {
8632001f49Smrg      printf("Couldn't read %s\n", IMAGE_FILE);
8732001f49Smrg      exit(0);
8832001f49Smrg   }
8932001f49Smrg#else
9032001f49Smrg   int i, j;
9132001f49Smrg   imgFormat = GL_RGB;
9232001f49Smrg   imgWidth = 3;
9332001f49Smrg   imgHeight = 3;
9432001f49Smrg   image = malloc(imgWidth * imgHeight * 3);
9532001f49Smrg   for (i = 0; i < imgHeight; i++) {
9632001f49Smrg      for (j = 0; j < imgWidth; j++) {
9732001f49Smrg         int k = (i * imgWidth + j) * 3;
9832001f49Smrg         if ((i + j) & 1) {
9932001f49Smrg            image[k+0] = 255;
10032001f49Smrg            image[k+1] = 0;
10132001f49Smrg            image[k+2] = 0;
10232001f49Smrg         }
10332001f49Smrg         else {
10432001f49Smrg            image[k+0] = 0;
10532001f49Smrg            image[k+1] = 255;
10632001f49Smrg            image[k+2] = 0;
10732001f49Smrg         }
10832001f49Smrg      }
10932001f49Smrg   }
11032001f49Smrg#endif
11132001f49Smrg
11232001f49Smrg   printf("Read %d x %d\n", imgWidth, imgHeight);
11332001f49Smrg
11432001f49Smrg   minDim = imgWidth < imgHeight ? imgWidth : imgHeight;
11532001f49Smrg
11632001f49Smrg   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
11732001f49Smrg
11832001f49Smrg   /*
11932001f49Smrg    * 1D Texture.  Test proxy first, if that works, test non-proxy target.
12032001f49Smrg    */
12132001f49Smrg   glTexImage1D(GL_PROXY_TEXTURE_1D, 0, GL_RGB, imgWidth, 0,
12232001f49Smrg                imgFormat, GL_UNSIGNED_BYTE, image);
12332001f49Smrg   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_1D, 0, GL_TEXTURE_WIDTH, &w);
12432001f49Smrg   assert(w == imgWidth || w == 0);
12532001f49Smrg
12632001f49Smrg   if (w) {
12732001f49Smrg      glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, imgWidth, 0,
12832001f49Smrg                   imgFormat, GL_UNSIGNED_BYTE, image);
12932001f49Smrg      assert(glGetError() == GL_NO_ERROR);
13032001f49Smrg   }
13132001f49Smrg
13232001f49Smrg
13332001f49Smrg   /*
13432001f49Smrg    * 2D Texture
13532001f49Smrg    */
13632001f49Smrg   glTexImage2D(GL_PROXY_TEXTURE_2D, 0, GL_RGB, imgWidth, imgHeight, 0,
13732001f49Smrg                imgFormat, GL_UNSIGNED_BYTE, image);
13832001f49Smrg   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w);
13932001f49Smrg   assert(w == imgWidth || w == 0);
14032001f49Smrg
14132001f49Smrg   if (w) {
14232001f49Smrg      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imgWidth, imgHeight, 0,
14332001f49Smrg                   imgFormat, GL_UNSIGNED_BYTE, image);
14432001f49Smrg      assert(glGetError() == GL_NO_ERROR);
14532001f49Smrg   }
14632001f49Smrg
14732001f49Smrg
14832001f49Smrg   /*
14932001f49Smrg    * 3D Texture
15032001f49Smrg    */
15132001f49Smrg   glTexImage3D(GL_PROXY_TEXTURE_3D, 0, GL_RGB, imgWidth, imgHeight, 1, 0,
15232001f49Smrg                imgFormat, GL_UNSIGNED_BYTE, image);
15332001f49Smrg   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &w);
15432001f49Smrg   assert(w == imgWidth || w == 0);
15532001f49Smrg
15632001f49Smrg   if (w) {
15732001f49Smrg      glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB, imgWidth, imgHeight, 1, 0,
15832001f49Smrg                   imgFormat, GL_UNSIGNED_BYTE, image);
15932001f49Smrg      assert(glGetError() == GL_NO_ERROR);
16032001f49Smrg   }
16132001f49Smrg
16232001f49Smrg
16332001f49Smrg   /*
16432001f49Smrg    * Cube Texture
16532001f49Smrg    */
16632001f49Smrg   glTexImage2D(GL_PROXY_TEXTURE_CUBE_MAP, 0, GL_RGB,
16732001f49Smrg                minDim, minDim, 0,
16832001f49Smrg                imgFormat, GL_UNSIGNED_BYTE, image);
16932001f49Smrg   glGetTexLevelParameteriv(GL_PROXY_TEXTURE_CUBE_MAP, 0, GL_TEXTURE_WIDTH, &w);
17032001f49Smrg   assert(w == minDim || w == 0);
17132001f49Smrg
17232001f49Smrg   if (w) {
17332001f49Smrg      glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB,
17432001f49Smrg                   minDim, minDim, 0,
17532001f49Smrg                   imgFormat, GL_UNSIGNED_BYTE, image);
17632001f49Smrg      assert(glGetError() == GL_NO_ERROR);
17732001f49Smrg   }
17832001f49Smrg
17932001f49Smrg   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
18032001f49Smrg   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
18132001f49Smrg   glEnable(GL_TEXTURE_2D);
18232001f49Smrg}
18332001f49Smrg
18432001f49Smrg
18532001f49Smrgint main( int argc, char *argv[] )
18632001f49Smrg{
18732001f49Smrg   glutInit( &argc, argv );
18832001f49Smrg   glutInitWindowPosition( 0, 0 );
18932001f49Smrg   glutInitWindowSize( 400, 400 );
19032001f49Smrg   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
19132001f49Smrg   glutCreateWindow(argv[0]);
19232001f49Smrg   glewInit();
19332001f49Smrg   glutReshapeFunc( Reshape );
19432001f49Smrg   glutKeyboardFunc( Key );
19532001f49Smrg   glutDisplayFunc( Display );
19632001f49Smrg   Init();
19732001f49Smrg   glutMainLoop();
19832001f49Smrg   return 0;
19932001f49Smrg}
200