132001f49Smrg/* 232001f49Smrg * Test glTexSubImage mid-way through a frame. 332001f49Smrg * 432001f49Smrg * The same texture is used for both quads but it gets redefined 532001f49Smrg * with glTexSubImage (or glTexImage) after the first quad. 632001f49Smrg */ 732001f49Smrg 832001f49Smrg 932001f49Smrg#include <assert.h> 1032001f49Smrg#include <stdio.h> 1132001f49Smrg#include <stdlib.h> 1232001f49Smrg#include "GL/glew.h" 1332001f49Smrg#include "glut_wrap.h" 1432001f49Smrg 1532001f49Smrgstatic GLuint Window = 0; 1632001f49Smrgstatic GLboolean Anim = GL_FALSE; 1732001f49Smrgstatic GLfloat Angle = 0.0f; 1832001f49Smrg 1932001f49Smrg 2032001f49Smrg 2132001f49Smrgstatic void 2232001f49Smrgfirst_texture(void) 2332001f49Smrg{ 2432001f49Smrg static int width=8, height=8; 2532001f49Smrg static GLubyte tex1[] = { 2632001f49Smrg 0, 0, 0, 0, 0, 0, 0, 0, 2732001f49Smrg 0, 0, 0, 0, 1, 0, 0, 0, 2832001f49Smrg 0, 0, 0, 1, 1, 0, 0, 0, 2932001f49Smrg 0, 0, 0, 0, 1, 0, 0, 0, 3032001f49Smrg 0, 0, 0, 0, 1, 0, 0, 0, 3132001f49Smrg 0, 0, 0, 0, 1, 0, 0, 0, 3232001f49Smrg 0, 0, 0, 1, 1, 1, 0, 0, 3332001f49Smrg 0, 0, 0, 0, 0, 0, 0, 0 }; 3432001f49Smrg 3532001f49Smrg GLubyte tex[64][3]; 3632001f49Smrg GLint i, j; 3732001f49Smrg 3832001f49Smrg /* red on white */ 3932001f49Smrg for (i=0;i<height;i++) { 4032001f49Smrg for (j=0;j<width;j++) { 4132001f49Smrg int p = i*width+j; 4232001f49Smrg if (tex1[(height-i-1)*width+j]) { 4332001f49Smrg tex[p][0] = 255; tex[p][1] = 0; tex[p][2] = 0; 4432001f49Smrg } 4532001f49Smrg else { 4632001f49Smrg tex[p][0] = 255; tex[p][1] = 255; tex[p][2] = 255; 4732001f49Smrg } 4832001f49Smrg } 4932001f49Smrg } 5032001f49Smrg 5132001f49Smrg glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0, 5232001f49Smrg GL_RGB, GL_UNSIGNED_BYTE, tex ); 5332001f49Smrg} 5432001f49Smrg 5532001f49Smrg 5632001f49Smrgstatic void 5732001f49Smrgsecond_texture(void) 5832001f49Smrg{ 5932001f49Smrg static int width=8, height=8; 6032001f49Smrg 6132001f49Smrg static GLubyte tex2[] = { 6232001f49Smrg 0, 0, 0, 0, 0, 0, 0, 0, 6332001f49Smrg 0, 0, 0, 2, 2, 0, 0, 0, 6432001f49Smrg 0, 0, 2, 0, 0, 2, 0, 0, 6532001f49Smrg 0, 0, 0, 0, 0, 2, 0, 0, 6632001f49Smrg 0, 0, 0, 0, 2, 0, 0, 0, 6732001f49Smrg 0, 0, 0, 2, 0, 0, 0, 0, 6832001f49Smrg 0, 0, 2, 2, 2, 2, 0, 0, 6932001f49Smrg 0, 0, 0, 0, 0, 0, 0, 0 }; 7032001f49Smrg 7132001f49Smrg GLubyte tex[64][3]; 7232001f49Smrg GLint i, j; 7332001f49Smrg 7432001f49Smrg /* green on blue */ 7532001f49Smrg for (i=0;i<height;i++) { 7632001f49Smrg for (j=0;j<width;j++) { 7732001f49Smrg int p = i*width+j; 7832001f49Smrg if (tex2[(height-i-1)*width+j]) { 7932001f49Smrg tex[p][0] = 0; tex[p][1] = 255; tex[p][2] = 0; 8032001f49Smrg } 8132001f49Smrg else { 8232001f49Smrg tex[p][0] = 0; tex[p][1] = 0; tex[p][2] = 255; 8332001f49Smrg } 8432001f49Smrg } 8532001f49Smrg } 8632001f49Smrg#if 0 8732001f49Smrg glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0, 8832001f49Smrg GL_RGB, GL_UNSIGNED_BYTE, tex ); 8932001f49Smrg#else 9032001f49Smrg glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, 9132001f49Smrg GL_RGB, GL_UNSIGNED_BYTE, tex ); 9232001f49Smrg#endif 9332001f49Smrg} 9432001f49Smrg 9532001f49Smrg 9632001f49Smrg 9732001f49Smrgstatic void draw( void ) 9832001f49Smrg{ 9932001f49Smrg glClear( GL_COLOR_BUFFER_BIT ); 10032001f49Smrg 10132001f49Smrg glColor3f( 1.0, 1.0, 1.0 ); 10232001f49Smrg 10332001f49Smrg /* draw first polygon */ 10432001f49Smrg glPushMatrix(); 10532001f49Smrg glTranslatef( -1.0, 0.0, 0.0 ); 10632001f49Smrg glRotatef( Angle, 0.0, 0.0, 1.0 ); 10732001f49Smrg 10832001f49Smrg first_texture(); 10932001f49Smrg 11032001f49Smrg glBegin( GL_POLYGON ); 11132001f49Smrg glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 ); 11232001f49Smrg glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 ); 11332001f49Smrg glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 ); 11432001f49Smrg glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 ); 11532001f49Smrg glEnd(); 11632001f49Smrg glPopMatrix(); 11732001f49Smrg 11832001f49Smrg /* draw second polygon */ 11932001f49Smrg glPushMatrix(); 12032001f49Smrg glTranslatef( 1.0, 0.0, 0.0 ); 12132001f49Smrg glRotatef( Angle-90.0, 0.0, 1.0, 0.0 ); 12232001f49Smrg 12332001f49Smrg second_texture(); 12432001f49Smrg 12532001f49Smrg glBegin( GL_POLYGON ); 12632001f49Smrg glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 ); 12732001f49Smrg glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 ); 12832001f49Smrg glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 ); 12932001f49Smrg glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 ); 13032001f49Smrg glEnd(); 13132001f49Smrg glPopMatrix(); 13232001f49Smrg 13332001f49Smrg glutSwapBuffers(); 13432001f49Smrg} 13532001f49Smrg 13632001f49Smrg 13732001f49Smrg 13832001f49Smrgstatic void idle( void ) 13932001f49Smrg{ 14032001f49Smrg static double t0 = -1.; 14132001f49Smrg double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; 14232001f49Smrg if (t0 < 0.0) 14332001f49Smrg t0 = t; 14432001f49Smrg dt = t - t0; 14532001f49Smrg t0 = t; 14632001f49Smrg Angle += 120.0*dt; 14732001f49Smrg glutPostRedisplay(); 14832001f49Smrg} 14932001f49Smrg 15032001f49Smrg 15132001f49Smrg 15232001f49Smrg/* change view Angle, exit upon ESC */ 15332001f49Smrgstatic void key(unsigned char k, int x, int y) 15432001f49Smrg{ 15532001f49Smrg (void) x; 15632001f49Smrg (void) y; 15732001f49Smrg switch (k) { 15832001f49Smrg case 'a': 15932001f49Smrg Anim = !Anim; 16032001f49Smrg if (Anim) 16132001f49Smrg glutIdleFunc( idle ); 16232001f49Smrg else 16332001f49Smrg glutIdleFunc( NULL ); 16432001f49Smrg break; 16532001f49Smrg case 27: 16632001f49Smrg glutDestroyWindow(Window); 16732001f49Smrg exit(0); 16832001f49Smrg } 16932001f49Smrg} 17032001f49Smrg 17132001f49Smrg 17232001f49Smrg 17332001f49Smrg/* new window size or exposure */ 17432001f49Smrgstatic void reshape( int width, int height ) 17532001f49Smrg{ 17632001f49Smrg glViewport(0, 0, (GLint)width, (GLint)height); 17732001f49Smrg glMatrixMode(GL_PROJECTION); 17832001f49Smrg glLoadIdentity(); 17932001f49Smrg /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 );*/ 18032001f49Smrg glFrustum( -2.0, 2.0, -2.0, 2.0, 6.0, 20.0 ); 18132001f49Smrg glMatrixMode(GL_MODELVIEW); 18232001f49Smrg glLoadIdentity(); 18332001f49Smrg glTranslatef( 0.0, 0.0, -8.0 ); 18432001f49Smrg} 18532001f49Smrg 18632001f49Smrg 18732001f49Smrgstatic void init( void ) 18832001f49Smrg{ 18932001f49Smrg /* Setup texturing */ 19032001f49Smrg glEnable( GL_TEXTURE_2D ); 19132001f49Smrg glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); 19232001f49Smrg 19332001f49Smrg 19432001f49Smrg glBindTexture( GL_TEXTURE_2D, 0 ); 19532001f49Smrg glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); 19632001f49Smrg glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); 19732001f49Smrg glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); 19832001f49Smrg glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); 19932001f49Smrg} 20032001f49Smrg 20132001f49Smrg 20232001f49Smrg 20332001f49Smrgint main( int argc, char *argv[] ) 20432001f49Smrg{ 20532001f49Smrg glutInit(&argc, argv); 20632001f49Smrg glutInitWindowPosition(0, 0); 20732001f49Smrg glutInitWindowSize(300, 300); 20832001f49Smrg glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE ); 20932001f49Smrg 21032001f49Smrg Window = glutCreateWindow("Texture Objects"); 21132001f49Smrg glewInit(); 21232001f49Smrg if (!Window) { 21332001f49Smrg exit(1); 21432001f49Smrg } 21532001f49Smrg 21632001f49Smrg init(); 21732001f49Smrg 21832001f49Smrg glutReshapeFunc( reshape ); 21932001f49Smrg glutKeyboardFunc( key ); 22032001f49Smrg if (Anim) 22132001f49Smrg glutIdleFunc( idle ); 22232001f49Smrg glutDisplayFunc( draw ); 22332001f49Smrg glutMainLoop(); 22432001f49Smrg return 0; 22532001f49Smrg} 226