/* $Id: texobj.c,v 1.3 2000/03/01 03:36:40 brianp Exp $ */ /* * Example of using the 1.1 texture object functions. * Also, this demo utilizes Mesa's fast texture map path. * * Brian Paul June 1996 This file is in the public domain. */ /* * $Log: texobj.c,v $ * Revision 1.3 2000/03/01 03:36:40 brianp * test for GL 1.2 * * Revision 1.2 2000/02/25 23:24:06 brianp * fixed bug when using display lists * * Revision 1.1.1.1 1999/08/19 00:55:40 jtg * Imported sources * * Revision 3.1 1999/03/28 18:24:37 brianp * minor clean-up * * Revision 3.0 1998/02/14 18:42:29 brianp * initial rev * */ #include #include #include #include "GL/glut.h" static GLuint Window = 0; static GLuint TexObj[2]; static GLfloat Angle = 0.0f; static GLboolean HaveTexObj = GL_FALSE; #if defined(GL_VERSION_1_1) || defined(GL_VERSION_1_2) # define TEXTURE_OBJECT 1 #elif defined(GL_EXT_texture_object) # define TEXTURE_OBJECT 1 # define glBindTexture(A,B) glBindTextureEXT(A,B) # define glGenTextures(A,B) glGenTexturesEXT(A,B) # define glDeleteTextures(A,B) glDeleteTexturesEXT(A,B) #endif static void draw( void ) { glDepthFunc(GL_EQUAL); /* glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );*/ glClear( GL_COLOR_BUFFER_BIT ); glColor3f( 1.0, 1.0, 1.0 ); /* draw first polygon */ glPushMatrix(); glTranslatef( -1.0, 0.0, 0.0 ); glRotatef( Angle, 0.0, 0.0, 1.0 ); if (HaveTexObj) { #ifdef TEXTURE_OBJECT glBindTexture( GL_TEXTURE_2D, TexObj[0] ); #endif } else { glCallList( TexObj[0] ); } glBegin( GL_POLYGON ); glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 ); glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 ); glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 ); glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 ); glEnd(); glPopMatrix(); /* draw second polygon */ glPushMatrix(); glTranslatef( 1.0, 0.0, 0.0 ); glRotatef( Angle-90.0, 0.0, 1.0, 0.0 ); if (HaveTexObj) { #ifdef TEXTURE_OBJECT glBindTexture( GL_TEXTURE_2D, TexObj[1] ); #endif } else { glCallList( TexObj[1] ); } glBegin( GL_POLYGON ); glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 ); glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 ); glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 ); glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 ); glEnd(); glPopMatrix(); glutSwapBuffers(); } static void idle( void ) { Angle += 2.0; glutPostRedisplay(); } /* change view Angle, exit upon ESC */ static void key(unsigned char k, int x, int y) { (void) x; (void) y; switch (k) { case 27: #ifdef TEXTURE_OBJECT glDeleteTextures( 2, TexObj ); #endif glutDestroyWindow(Window); exit(0); } } /* new window size or exposure */ static void reshape( int width, int height ) { glViewport(0, 0, (GLint)width, (GLint)height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 );*/ glFrustum( -2.0, 2.0, -2.0, 2.0, 6.0, 20.0 ); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef( 0.0, 0.0, -8.0 ); } static void init( void ) { static int width=8, height=8; static GLubyte tex1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static GLubyte tex2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; GLubyte tex[64][3]; GLint i, j; glDisable( GL_DITHER ); /* Setup texturing */ glEnable( GL_TEXTURE_2D ); glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST ); /* generate texture object IDs */ if (HaveTexObj) { #ifdef TEXTURE_OBJECT glGenTextures( 2, TexObj ); #endif } else { TexObj[0] = glGenLists(2); TexObj[1] = TexObj[0]+1; } /* setup first texture object */ if (HaveTexObj) { #ifdef TEXTURE_OBJECT glBindTexture( GL_TEXTURE_2D, TexObj[0] ); #endif } else { glNewList( TexObj[0], GL_COMPILE ); } /* red on white */ for (i=0;i