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