#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,
- glBegin(GL_QUADS);
+ /* +Z side */
+ eps1, -eps1, 1.0,
+ -eps1, -eps1, 1.0,
+ -eps1, eps1, 1.0,
+ eps1, eps1, 1.0,
+
+ /* -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,
+};
- glEnd();
+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 );
+
+ 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();
+ }
}
static void key(unsigned char k, int x, int y)
{
- static GLboolean anim = GL_TRUE;
static GLuint mode = 0;
(void) x;
(void) 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)
int main( int argc, char *argv[] )
{
+ glutInit(&argc, argv);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 500);
glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
glutReshapeFunc( reshape );
glutKeyboardFunc( key );
glutSpecialFunc( specialkey );
- glutIdleFunc( idle );
glutDisplayFunc( draw );
+ if (anim)
+ glutIdleFunc(idle);
usage();
glutMainLoop();
return 0;