free display lists and destroy window upon exit
[mesa.git] / progs / demos / cubemap.c
index 5818337c12679dc61592e461dafe817ffcefa086..0a59b9898356ce35c85b451f91bc7c36f5afe13f 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id: cubemap.c,v 1.4 2002/10/25 17:20:26 brianp Exp $ */
-
 /*
  * GL_ARB_texture_cube_map demo
  *
 #include <stdlib.h>
 #include <string.h>
 #include "GL/glut.h"
-#include "../util/readtex.c" /* a hack */
+#include "readtex.h"
 
 
 static GLfloat Xrot = 0, Yrot = 0;
 static GLfloat EyeDist = 10;
+static GLboolean use_vertex_arrays = GL_FALSE;
+static GLboolean anim = GL_TRUE;
 
+#define eps1 0.99
+#define br   20.0  /* box radius */
 
-static void draw_skybox( void )
-{
-   const GLfloat eps1 = 0.99;
-   const GLfloat br = 20.0; /* box radius */
+static const GLfloat tex_coords[] = {
+   /* +X side */
+   1.0, -eps1, -eps1,
+   1.0, -eps1,  eps1,
+   1.0,  eps1,  eps1,
+   1.0,  eps1, -eps1,
+
+   /* -X side */
+   -1.0,  eps1, -eps1,
+   -1.0,  eps1,  eps1,
+   -1.0, -eps1,  eps1,
+   -1.0, -eps1, -eps1,
+
+   /* +Y side */
+   -eps1, 1.0, -eps1,
+   -eps1, 1.0,  eps1,
+    eps1, 1.0,  eps1,
+    eps1, 1.0, -eps1,
+
+   /* -Y side */
+   -eps1, -1.0, -eps1,
+   -eps1, -1.0,  eps1,
+    eps1, -1.0,  eps1,
+    eps1, -1.0, -eps1,
+
+   /* +Z side */
+    eps1, -eps1, 1.0,
+   -eps1, -eps1, 1.0,
+   -eps1,  eps1, 1.0,
+    eps1,  eps1, 1.0,
 
-   glBegin(GL_QUADS);
+   /* -Z side */
+    eps1,  eps1, -1.0,
+   -eps1,  eps1, -1.0,
+   -eps1, -eps1, -1.0,
+    eps1, -eps1, -1.0,
+};
 
+static const GLfloat vtx_coords[] = {
    /* +X side */
-   glTexCoord3f(1.0, -eps1, -eps1);  glVertex3f(br, -br, -br);
-   glTexCoord3f(1.0, -eps1,  eps1);  glVertex3f(br, -br,  br);
-   glTexCoord3f(1.0,  eps1,  eps1);  glVertex3f(br,  br,  br);
-   glTexCoord3f(1.0,  eps1, -eps1);  glVertex3f(br,  br, -br);
+   br, -br, -br,
+   br, -br,  br,
+   br,  br,  br,
+   br,  br, -br,
 
    /* -X side */
-   glTexCoord3f(-1.0,  eps1, -eps1);  glVertex3f(-br,  br, -br);
-   glTexCoord3f(-1.0,  eps1,  eps1);  glVertex3f(-br,  br,  br);
-   glTexCoord3f(-1.0, -eps1,  eps1);  glVertex3f(-br, -br,  br);
-   glTexCoord3f(-1.0, -eps1, -eps1);  glVertex3f(-br, -br, -br);
+   -br,  br, -br,
+   -br,  br,  br,
+   -br, -br,  br,
+   -br, -br, -br,
 
    /* +Y side */
-   glTexCoord3f(-eps1, 1.0, -eps1);  glVertex3f(-br,  br, -br);
-   glTexCoord3f(-eps1, 1.0,  eps1);  glVertex3f(-br,  br,  br);
-   glTexCoord3f( eps1, 1.0,  eps1);  glVertex3f( br,  br,  br);
-   glTexCoord3f( eps1, 1.0, -eps1);  glVertex3f( br,  br, -br);
+   -br,  br, -br,
+   -br,  br,  br,
+    br,  br,  br,
+    br,  br, -br,
 
    /* -Y side */
-   glTexCoord3f(-eps1, -1.0, -eps1);  glVertex3f(-br, -br, -br);
-   glTexCoord3f(-eps1, -1.0,  eps1);  glVertex3f(-br, -br,  br);
-   glTexCoord3f( eps1, -1.0,  eps1);  glVertex3f( br, -br,  br);
-   glTexCoord3f( eps1, -1.0, -eps1);  glVertex3f( br, -br, -br);
+   -br, -br, -br,
+   -br, -br,  br,
+    br, -br,  br,
+    br, -br, -br,
 
    /* +Z side */
-   glTexCoord3f( eps1, -eps1, 1.0);  glVertex3f( br, -br, br);
-   glTexCoord3f(-eps1, -eps1, 1.0);  glVertex3f(-br, -br, br);
-   glTexCoord3f(-eps1,  eps1, 1.0);  glVertex3f(-br,  br, br);
-   glTexCoord3f( eps1,  eps1, 1.0);  glVertex3f( br,  br, br);
+    br, -br, br,
+   -br, -br, br,
+   -br,  br, br,
+    br,  br, br,
 
    /* -Z side */
-   glTexCoord3f( eps1,  eps1, -1.0);  glVertex3f( br,  br, -br);
-   glTexCoord3f(-eps1,  eps1, -1.0);  glVertex3f(-br,  br, -br);
-   glTexCoord3f(-eps1, -eps1, -1.0);  glVertex3f(-br, -br, -br);
-   glTexCoord3f( eps1, -eps1, -1.0);  glVertex3f( br, -br, -br);
+    br,  br, -br,
+   -br,  br, -br,
+   -br, -br, -br,
+    br, -br, -br,
+};
+
+static void draw_skybox( void )
+{
+   if ( use_vertex_arrays ) {
+      glTexCoordPointer( 3, GL_FLOAT, 0, tex_coords );
+      glVertexPointer(   3, GL_FLOAT, 0, vtx_coords );
+
+      glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+      glEnableClientState( GL_VERTEX_ARRAY );
+
+      glDrawArrays( GL_QUADS, 0, 24 );
 
-   glEnd();
+      glDisableClientState( GL_TEXTURE_COORD_ARRAY );
+      glDisableClientState( GL_VERTEX_ARRAY );
+   }
+   else {
+      unsigned   i;
+
+      glBegin(GL_QUADS);
+      for ( i = 0 ; i < 24 ; i++ ) {
+        glTexCoord3fv( & tex_coords[ i * 3 ] );
+        glVertex3fv  ( & vtx_coords[ i * 3 ] );
+      }
+      glEnd();
+   }
 }
 
 
@@ -162,7 +220,6 @@ static void set_mode(GLuint mode)
 
 static void key(unsigned char k, int x, int y)
 {
-   static GLboolean anim = GL_TRUE;
    static GLuint mode = 0;
    (void) x;
    (void) y;
@@ -178,6 +235,11 @@ static void key(unsigned char k, int x, int y)
          mode = !mode;
          set_mode(mode);
          break;
+      case 'v':
+         use_vertex_arrays = ! use_vertex_arrays;
+         printf( "Vertex arrays are %sabled\n",
+                (use_vertex_arrays) ? "en" : "dis" );
+         break;
       case 'z':
          EyeDist -= 0.5;
          if (EyeDist < 6.0)
@@ -236,12 +298,12 @@ static void init_checkers( void )
 #define CUBE_TEX_SIZE 64
    GLubyte image[CUBE_TEX_SIZE][CUBE_TEX_SIZE][3];
    static const GLubyte colors[6][3] = {
-      { 255,   0,   0 },
-      {   0, 255, 255 },
-      {   0, 255,   0 },
-      { 255,   0, 255 },
-      {   0,   0, 255 },
-      { 255, 255,   0 }
+      { 255,   0,   0 },       /* face 0 - red */
+      {   0, 255, 255 },       /* face 1 - cyan */
+      {   0, 255,   0 },       /* face 2 - green */
+      { 255,   0, 255 },       /* face 3 - purple */
+      {   0,   0, 255 },       /* face 4 - blue */
+      { 255, 255,   0 }                /* face 5 - yellow */
    };
    static const GLenum targets[6] = {
       GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
@@ -395,7 +457,7 @@ int main( int argc, char *argv[] )
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(600, 500);
    glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
-   glutCreateWindow("Texture Cube Maping");
+   glutCreateWindow("Texture Cube Mapping");
 
    if (argc > 1 && strcmp(argv[1] , "-i") == 0)
       init( 1 );
@@ -404,8 +466,9 @@ int main( int argc, char *argv[] )
    glutReshapeFunc( reshape );
    glutKeyboardFunc( key );
    glutSpecialFunc( specialkey );
-   glutIdleFunc( idle );
    glutDisplayFunc( draw );
+   if (anim)
+      glutIdleFunc(idle);
    usage();
    glutMainLoop();
    return 0;