home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / System / Mesa-3.1 / demos / multiext.c < prev    next >
C/C++ Source or Header  |  2000-01-07  |  10KB  |  391 lines

  1. /* $Id: multiext.c,v 1.1 1998/06/10 02:51:27 brianp Exp $ */
  2.  
  3. /*
  4.  * Multitexture demo  USING NEW GL_EXT_multitexture EXTENSION
  5.  * Brian Paul  June 1998  This program is in the public domain.
  6.  */
  7.  
  8. /*
  9.  * $Log: multiext.c,v $
  10.  * Revision 1.1  1998/06/10 02:51:27  brianp
  11.  * Initial revision
  12.  *
  13.  */
  14.  
  15.  
  16. /*
  17.  * Some information about the multitexture extension:
  18.  
  19. There are two distinct elements to texture mapping:  coordinate specification
  20. and sampling/application.  This distinction must be understood in order to
  21. effectively use multitexturing.
  22.  
  23. The multitexture extension supports multiple sets of texture coordinates
  24. and multiple texture environments (an environment is a texture image and
  25. its sampling and application parameters.)
  26.  
  27. Typically, texture coordinate set 0 is used to sample texture image 0
  28. and texture coordinate set 1 is used to sample texture image 1.  But, it's
  29. also possible to use coordinate set 0 to sample both images (as seen later).
  30.  
  31. The number of texture coordinate sets available is queried with
  32. glGetIntegerv(GL_MAX_TEXTURE_COORD_SETS_EXT, &n).
  33.  
  34. The number of texture environments available is queried with
  35. glGetIntegerv(GL_MAX_TEXTURES_EXT, &n).
  36.  
  37.  
  38. Coordinate specification:
  39.  
  40.    The new glMultiTexCoord*EXT() functions take a target parameter which
  41.    explictly controls which set of texture coordinates are being set.
  42.  
  43.    The normal glTexCoord() functions modify the GL_TEXTURE0_EXT (0th) set
  44.    of texture coordinates, by default.
  45.  
  46.    The new glSelectTextureCoordSetEXT() function is used to change the
  47.    texture coordinate set targeted by the glTexCoord() functions.  For
  48.    example, after calling glSelectTextureCoordSetEXT(GL_TEXTURE1_EXT)
  49.    the glTexCoord*() functions will modify texture coordinate set 1 instead
  50.    of 0.
  51.  
  52.  
  53. Texture sampling/application:
  54.  
  55.    The texture environment controls how textures are sampled (nearest,
  56.    linear, etc) and applied (replace, modulate, blend, etc).
  57.  
  58.    glSelectTextureEXT() selects the current texture environment.
  59.    Subsequent calls to glTexEnv*(), glTexParameter*(), glTexImage*D(),
  60.    etc will address the texture environment which was specified by
  61.    glSelectTextureEXT().
  62.  
  63.    Of particular interest is the call glTexEnv*(GL_TEXTURE_ENV,
  64.    GL_TEXTURE_ENV_COORD_SET_EXT, t).  This controls the texture coordinate
  65.    source for the current texture environment.
  66.  
  67.    For example, if you have two texture environments and want both to use
  68.    texture coordinate set 0 then you would do the following:
  69.  
  70.       glSelectTextureEXT(GL_TEXTURE0_EXT);
  71.       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COORD_SET_EXT, GL_TEXTURE0_EXT);
  72.       glSelectTextureEXT(GL_TEXTURE1_EXT);
  73.       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COORD_SET_EXT, GL_TEXTURE0_EXT);
  74.  
  75.    Another example- if you have two texture environments and wanted to use
  76.    separate texture coordinates for each environment then you would do the
  77.    following:
  78.  
  79.       glSelectTextureEXT(GL_TEXTURE0_EXT);
  80.       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COORD_SET_EXT, GL_TEXTURE0_EXT);
  81.       glSelectTextureEXT(GL_TEXTURE1_EXT);
  82.       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COORD_SET_EXT, GL_TEXTURE1_EXT);
  83.  
  84.  
  85. Coordinate transformation and automatic generation:
  86.  
  87.    Multitexturing also replicates texture coordinate transformation state.
  88.    That is, there will be multiple texture coordinate matrices and texture
  89.    matrix stacks.
  90.  
  91.    Texture matrix 0 will transform texture coordiante set 0,
  92.    texture matrix 1 will transform texture coordiante set 1, etc.
  93.  
  94.    Similarly, automatic texture coordinate generation can be independantly
  95.    specified for each texture coordinate set.
  96.  
  97.    The new glSelectTextureTransformEXT() function controls which texture
  98.    matrix or texgen state is the current one.
  99.  
  100.    For example, after calling glSelectTextureTransformEXT(GL_TEXTUREn_EXT)
  101.    and glMatrixMode(GL_TEXTURE) the nth texture matrix will be effected by
  102.    subsequent glLoadMatrix(), glMultMatrix(), glTranslate(), etc calls.
  103.    The demonstration program below does exactly this.
  104.  
  105.  */
  106.  
  107.  
  108.  
  109. #include <math.h>
  110. #include <stdio.h>
  111. #include <stdlib.h>
  112. #include <string.h>
  113. #include <GL/glut.h>
  114.  
  115. #include "../util/readtex.c"   /* I know, this is a hack. */
  116.  
  117.  
  118. #define TEX0 1
  119. #define TEX1 2
  120. #define TEXBOTH 3
  121. #define ANIMATE 10
  122. #define QUIT 100
  123.  
  124. static GLboolean Animate = GL_TRUE;
  125.  
  126. static GLfloat Drift = 0.0;
  127. static GLfloat Xrot = 20.0, Yrot = 30.0, Zrot = 0.0;
  128. static GLfloat DXrot = 1.0, DYrot = 2.5;
  129.  
  130.  
  131. static void Idle( void )
  132. {
  133.    if (Animate) {
  134.       Drift += 0.05;
  135.  
  136.       /* Transformation of texture coordinate set 0 */
  137. #ifdef GL_EXT_multitexture
  138.       glSelectTextureTransformEXT(GL_TEXTURE0_EXT);
  139. #endif
  140.       glMatrixMode(GL_TEXTURE);
  141.       glLoadIdentity();
  142.       glTranslatef(Drift, 0.0, 0.0);
  143.  
  144.       /* Transformation of texture coordinate set 1 */
  145. #ifdef GL_EXT_multitexture
  146.       glSelectTextureTransformEXT(GL_TEXTURE1_EXT);
  147. #endif
  148.       glMatrixMode(GL_TEXTURE);
  149.       glLoadIdentity();
  150.       glTranslatef(0.0, Drift, 0.0);
  151.  
  152.  
  153.       glMatrixMode(GL_MODELVIEW);
  154.  
  155.       glutPostRedisplay();
  156.    }
  157. }
  158.  
  159.  
  160. static void DrawObject(void)
  161. {
  162.    glBegin(GL_QUADS);
  163.  
  164. #ifdef GL_EXT_multitexture
  165.    glMultiTexCoord2fEXT(GL_TEXTURE0_EXT, 0.0, 0.0);
  166.    glMultiTexCoord2fEXT(GL_TEXTURE1_EXT, 0.0, 0.0);
  167.    glVertex2f(-1.0, -1.0);
  168.  
  169.    glMultiTexCoord2fEXT(GL_TEXTURE0_EXT, 2.0, 0.0);
  170.    glMultiTexCoord2fEXT(GL_TEXTURE1_EXT, 1.0, 0.0);
  171.    glVertex2f(1.0, -1.0);
  172.  
  173.    glMultiTexCoord2fEXT(GL_TEXTURE0_EXT, 2.0, 2.0);
  174.    glMultiTexCoord2fEXT(GL_TEXTURE1_EXT, 1.0, 1.0);
  175.    glVertex2f(1.0, 1.0);
  176.  
  177.    glMultiTexCoord2fEXT(GL_TEXTURE0_EXT, 0.0, 2.0);
  178.    glMultiTexCoord2fEXT(GL_TEXTURE1_EXT, 0.0, 1.0);
  179.    glVertex2f(-1.0, 1.0);
  180. #else
  181.    glTexCoord2f(0.0, 0.0);
  182.    glVertex2f(-1.0, -1.0);
  183.  
  184.    glTexCoord2f(1.0, 0.0);
  185.    glVertex2f(1.0, -1.0);
  186.  
  187.    glTexCoord2f(1.0, 1.0);
  188.    glVertex2f(1.0, 1.0);
  189.  
  190.    glTexCoord2f(0.0, 1.0);
  191.    glVertex2f(-1.0, 1.0);
  192. #endif
  193.  
  194.    glEnd();
  195. }
  196.  
  197.  
  198.  
  199. static void Display( void )
  200. {
  201.    glClear( GL_COLOR_BUFFER_BIT );
  202.  
  203.    glPushMatrix();
  204.       glRotatef(Xrot, 1.0, 0.0, 0.0);
  205.       glRotatef(Yrot, 0.0, 1.0, 0.0);
  206.       glRotatef(Zrot, 0.0, 0.0, 1.0);
  207.       glScalef(5.0, 5.0, 5.0);
  208.       DrawObject();
  209.    glPopMatrix();
  210.  
  211.    glutSwapBuffers();
  212. }
  213.  
  214.  
  215. static void Reshape( int width, int height )
  216. {
  217.    glViewport( 0, 0, width, height );
  218.    glMatrixMode( GL_PROJECTION );
  219.    glLoadIdentity();
  220.    glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 );
  221.    /*glOrtho( -6.0, 6.0, -6.0, 6.0, 10.0, 100.0 );*/
  222.    glMatrixMode( GL_MODELVIEW );
  223.    glLoadIdentity();
  224.    glTranslatef( 0.0, 0.0, -70.0 );
  225. }
  226.  
  227.  
  228. static void ModeMenu(int entry)
  229. {
  230.    GLboolean enable0 = GL_FALSE, enable1 = GL_FALSE;
  231.    if (entry==TEX0) {
  232.       enable0 = GL_TRUE;
  233.    }
  234.    else if (entry==TEX1) {
  235.       enable1 = GL_TRUE;
  236.    }
  237.    else if (entry==TEXBOTH) {
  238.       enable0 = GL_TRUE;
  239.       enable1 = GL_TRUE;
  240.    }
  241.    else if (entry==ANIMATE) {
  242.       Animate = !Animate;
  243.    }
  244.    else if (entry==QUIT) {
  245.       exit(0);
  246.    }
  247.  
  248.    if (entry != ANIMATE) {
  249. #ifdef GL_EXT_multitexture
  250.       glSelectTextureEXT(GL_TEXTURE0_EXT);
  251. #endif
  252.       if (enable0) {
  253.          glEnable(GL_TEXTURE_2D);
  254.       }
  255.       else
  256.          glDisable(GL_TEXTURE_2D);
  257.  
  258. #ifdef GL_EXT_multitexture
  259.       glSelectTextureEXT(GL_TEXTURE1_EXT);
  260. #endif
  261.       if (enable1) {
  262.          glEnable(GL_TEXTURE_2D);
  263.       }
  264.       else
  265.          glDisable(GL_TEXTURE_2D);
  266.    }
  267.  
  268.    glutPostRedisplay();
  269. }
  270.  
  271.  
  272. static void Key( unsigned char key, int x, int y )
  273. {
  274.    switch (key) {
  275.       case 27:
  276.          exit(0);
  277.          break;
  278.    }
  279.    glutPostRedisplay();
  280. }
  281.  
  282.  
  283. static void SpecialKey( int key, int x, int y )
  284. {
  285.    float step = 3.0;
  286.  
  287.    switch (key) {
  288.       case GLUT_KEY_UP:
  289.          Xrot += step;
  290.          break;
  291.       case GLUT_KEY_DOWN:
  292.          Xrot -= step;
  293.          break;
  294.       case GLUT_KEY_LEFT:
  295.          Yrot += step;
  296.          break;
  297.       case GLUT_KEY_RIGHT:
  298.          Yrot -= step;
  299.          break;
  300.    }
  301.    glutPostRedisplay();
  302. }
  303.  
  304.  
  305. static void Init( void )
  306. {
  307.    const char *exten = (const char *) glGetString(GL_EXTENSIONS);
  308.    if (!strstr(exten, "GL_EXT_multitexture")) {
  309.       printf("Sorry, GL_EXT_multitexture not supported by this renderer.\n");
  310.       exit(1);
  311.    }
  312.  
  313.    /* setup textur env 0 */
  314. #ifdef GL_EXT_multitexture
  315.    glSelectTextureEXT(GL_TEXTURE0_EXT);
  316.    glSelectTextureCoordSetEXT(GL_TEXTURE0_EXT);
  317. #endif
  318. #ifdef LINEAR_FILTER
  319.    /* linear filtering looks much nicer but is much slower for Mesa */
  320.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  321.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  322. #else
  323.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  324.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  325. #endif
  326.  
  327.    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  328.  
  329.    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  330.  
  331.    if (!LoadRGBMipmaps("girl.rgb", GL_RGB)) {
  332.       printf("Error: couldn't load texture image\n");
  333.       exit(1);
  334.    }
  335.  
  336.  
  337.    /* setup textur env 1 */
  338. #ifdef GL_EXT_multitexture
  339.    glSelectTextureEXT(GL_TEXTURE1_EXT);
  340.    glSelectTextureCoordSetEXT(GL_TEXTURE1_EXT);
  341. #endif
  342. #ifdef LINEAR_FILTER
  343.    /* linear filtering looks much nicer but is much slower for Mesa */
  344.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  345.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  346. #else
  347.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  348.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  349. #endif
  350.  
  351.    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  352.  
  353.    if (!LoadRGBMipmaps("reflect.rgb", GL_RGB)) {
  354.       printf("Error: couldn't load texture image\n");
  355.       exit(1);
  356.    }
  357.  
  358.    glShadeModel(GL_FLAT);
  359.    glClearColor(0.3, 0.3, 0.4, 1.0);
  360.  
  361.    ModeMenu(TEXBOTH);
  362. }
  363.  
  364.  
  365. int main( int argc, char *argv[] )
  366. {
  367.    glutInit( &argc, argv );
  368.    glutInitWindowSize( 300, 300 );
  369.    glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
  370.    glutCreateWindow(argv[0] );
  371.  
  372.    Init();
  373.  
  374.    glutReshapeFunc( Reshape );
  375.    glutKeyboardFunc( Key );
  376.    glutSpecialFunc( SpecialKey );
  377.    glutDisplayFunc( Display );
  378.    glutIdleFunc( Idle );
  379.  
  380.    glutCreateMenu(ModeMenu);
  381.    glutAddMenuEntry("Texture 0", TEX0);
  382.    glutAddMenuEntry("Texture 1", TEX1);
  383.    glutAddMenuEntry("Multi-texture", TEXBOTH);
  384.    glutAddMenuEntry("Toggle Animation", ANIMATE);
  385.    glutAddMenuEntry("Quit", QUIT);
  386.    glutAttachMenu(GLUT_RIGHT_BUTTON);
  387.  
  388.    glutMainLoop();
  389.    return 0;
  390. }
  391.