This is texobj.c in view mode; [Download] [Up]
/* texobj.c */ /* * Example of using the 1.1 texture object functions. * Also, this demo utilizes Mesa's fast texture map path. * * Brian Paul June 1996 */ #include <math.h> #include <stdlib.h> #include <string.h> #include "gltk.h" static GLuint TexObj[2]; static GLfloat Angle = 0.0f; static GLboolean HaveTexObj = GL_FALSE; #if defined(GL_VERSION_1_1) # 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 ) { /* 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[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(); tkSwapBuffers(); } static void idle( void ) { Angle += 2.0; draw(); } /* change view Angle, exit upon ESC */ static GLenum key(int k, GLenum mask) { switch (k) { case TK_ESCAPE: #ifdef TEXTURE_OBJECT glDeleteTextures( 2, TexObj ); #endif tkQuit(); } return GL_FALSE; } /* new window size or exposure */ static void reshape( int width, int height ) { GLfloat h = (GLfloat) height / (GLfloat) width; 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<height;i++) { for (j=0;j<width;j++) { int p = i*width+j; if (tex1[(height-i-1)*width+j]) { tex[p][0] = 255; tex[p][1] = 0; tex[p][2] = 0; } else { tex[p][0] = 255; tex[p][1] = 255; tex[p][2] = 255; } } } glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, tex ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); if (!HaveTexObj) { glEndList(); } /* end of texture object */ /* setup second texture object */ if (HaveTexObj) { #ifdef TEXTURE_OBJECT glBindTexture( GL_TEXTURE_2D, TexObj[1] ); #endif } else { glNewList( TexObj[1], GL_COMPILE ); } /* green on blue */ for (i=0;i<height;i++) { for (j=0;j<width;j++) { int p = i*width+j; if (tex2[(height-i-1)*width+j]) { tex[p][0] = 0; tex[p][1] = 255; tex[p][2] = 0; } else { tex[p][0] = 0; tex[p][1] = 0; tex[p][2] = 255; } } } glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, tex ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); if (!HaveTexObj) { glEndList(); } /* end texture object */ } main( int argc, char *argv[] ) { tkInitPosition(0, 0, 300, 300); tkInitDisplayMode( TK_RGB | TK_DEPTH | TK_DOUBLE | TK_DIRECT ); if (tkInitWindow("Texture Objects") == GL_FALSE) { tkQuit(); } /* check that renderer has the GL_EXT_texture_object extension * or supports OpenGL 1.1 */ #ifdef TEXTURE_OBJECT { char *exten = (char *) glGetString( GL_EXTENSIONS ); char *version = (char *) glGetString( GL_VERSION ); if ( strstr( exten, "GL_EXT_texture_object" ) || strncmp( version, "1.1", 3 )==0 ) { HaveTexObj = GL_TRUE; } } #endif init(); tkExposeFunc( reshape ); tkReshapeFunc( reshape ); tkKeyDownFunc( key ); tkIdleFunc( idle ); tkDisplayFunc( draw ); tkExec(); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.