diff options
| author | Keith Whitwell <keith@tungstengraphics.com> | 2008-10-14 13:56:12 +0100 | 
|---|---|---|
| committer | Keith Whitwell <keith@tungstengraphics.com> | 2008-10-14 14:18:36 +0100 | 
| commit | 055d986efefa310d6ffd1106e565ca2f5964159a (patch) | |
| tree | ccde9b730a213bcc060284ac446d05f07f62a7d2 /progs/trivial | |
| parent | 5548a3072f73b8868746b640535c4774657dc306 (diff) | |
trivial: more vp tests
Diffstat (limited to 'progs/trivial')
| -rw-r--r-- | progs/trivial/Makefile | 4 | ||||
| -rw-r--r-- | progs/trivial/tri-tex.c | 168 | ||||
| -rw-r--r-- | progs/trivial/vp-tri-cb-pos.c | 156 | ||||
| -rw-r--r-- | progs/trivial/vp-tri-cb-tex.c | 189 | ||||
| -rw-r--r-- | progs/trivial/vp-tri-tex.c | 137 | 
5 files changed, 654 insertions, 0 deletions
| diff --git a/progs/trivial/Makefile b/progs/trivial/Makefile index d282171826..6c8c9fad90 100644 --- a/progs/trivial/Makefile +++ b/progs/trivial/Makefile @@ -96,6 +96,7 @@ SOURCES = \  	tri-query.c \  	tri-scissor-tri.c \  	tri-stencil.c \ +	tri-tex.c \  	tri-tex-3d.c \  	tri-tri.c \  	tri-unfilled-edgeflag.c \ @@ -125,8 +126,11 @@ SOURCES = \  	vp-line-clip.c \  	vp-tri.c \  	vp-tri-swap.c \ +	vp-tri-tex.c \  	vp-tri-imm.c \  	vp-tri-cb.c \ +	vp-tri-cb-pos.c \ +	vp-tri-cb-tex.c \  	vp-unfilled.c   PROGS = $(SOURCES:%.c=%) diff --git a/progs/trivial/tri-tex.c b/progs/trivial/tri-tex.c new file mode 100644 index 0000000000..a0d75b4a33 --- /dev/null +++ b/progs/trivial/tri-tex.c @@ -0,0 +1,168 @@ +/* + * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the name of + * Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF + * ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <GL/glut.h> + + + +GLenum doubleBuffer; + +static void Init(void) +{ +   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER)); +   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION)); +   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR)); + +    glClearColor(0.0, 0.0, 1.0, 0.0); + + +#define SIZE 32 +   { +      GLubyte tex2d[SIZE][SIZE][3]; +      GLint s, t; + +      for (s = 0; s < SIZE; s++) { +	 for (t = 0; t < SIZE; t++) { +#if 0 +	    tex2d[t][s][0] = (s < SIZE/2) ? 0 : 255; +	    tex2d[t][s][1] = (t < SIZE/2) ? 0 : 255; +	    tex2d[t][s][2] = 0; +#else +	    tex2d[t][s][0] = s*255/(SIZE-1); +	    tex2d[t][s][1] = t*255/(SIZE-1); +	    tex2d[t][s][2] = 0; +#endif +	 } +      } + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + +      glTexImage2D(GL_TEXTURE_2D, 0, 3, SIZE, SIZE, 0, +                   GL_RGB, GL_UNSIGNED_BYTE, tex2d); + +      glEnable(GL_TEXTURE_2D); +      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +   } + +} + +static void Reshape(int width, int height) +{ + +    glViewport(0, 0, (GLint)width, (GLint)height); + +    glMatrixMode(GL_PROJECTION); +    glLoadIdentity(); +/*     glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); */ +    glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + +    switch (key) { +      case 27: +	exit(1); +      default: +	return; +    } + +    glutPostRedisplay(); +} + +static void Draw(void) +{ +   glClear(GL_COLOR_BUFFER_BIT);  + +   glBegin(GL_TRIANGLES); +   glTexCoord2f(1,-1);  +   glVertex3f( 0.9, -0.9, -0.0); +   glTexCoord2f(1,1);  +   glVertex3f( 0.9,  0.9, -0.0); +   glTexCoord2f(-1,0);  +   glVertex3f(-0.9,  0.0, -0.0); +   glEnd(); + +   glFlush(); + +   if (doubleBuffer) { +      glutSwapBuffers(); +   } +} + +static GLenum Args(int argc, char **argv) +{ +    GLint i; + +    doubleBuffer = GL_FALSE; + +    for (i = 1; i < argc; i++) { +        if (strcmp(argv[i], "-sb") == 0) { +	    doubleBuffer = GL_FALSE; +	} else if (strcmp(argv[i], "-db") == 0) { +	    doubleBuffer = GL_TRUE; +	} else { +	    fprintf(stderr, "%s (Bad option).\n", argv[i]); +	    return GL_FALSE; +	} +    } +    return GL_TRUE; +} + +int main(int argc, char **argv) +{ +    GLenum type; + +    glutInit(&argc, argv); + +    if (Args(argc, argv) == GL_FALSE) { +	exit(1); +    } + +    glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + +    type = GLUT_RGB | GLUT_ALPHA; +    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; +    glutInitDisplayMode(type); + +    if (glutCreateWindow("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/trivial/vp-tri-cb-pos.c b/progs/trivial/vp-tri-cb-pos.c new file mode 100644 index 0000000000..eb3aa0a8dc --- /dev/null +++ b/progs/trivial/vp-tri-cb-pos.c @@ -0,0 +1,156 @@ +/* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */ + +#include <stdio.h> +#include <assert.h> +#include <string.h> +#include <stdlib.h> +#include <math.h> +#define GL_GLEXT_PROTOTYPES +#include <GL/glut.h> + + + +GLenum doubleBuffer; + +static void Init(void) +{ +   GLint errno; +   GLuint prognum; +    +   static const char *prog1 = +      "!!ARBvp1.0\n" +      "PARAM Emission = state.material.emission; \n" +      "PARAM Ambient = state.material.ambient; \n" +      "PARAM Diffuse = state.material.diffuse; \n" +      "PARAM Specular = state.material.specular; \n" +      "DP4  result.position.x, Ambient, vertex.position;\n" +      "DP4  result.position.y, Diffuse, vertex.position;\n" +      "DP4  result.position.z, Specular, vertex.position;\n" +      "DP4  result.position.w, Emission, vertex.position;\n" +      "MOV  result.color, vertex.color;\n" +      "END\n"; + +   const float Ambient[4] = { 0.0, 1.0, 0.0, 0.0 }; +   const float Diffuse[4] = { 1.0, 0.0, 0.0, 0.0 }; +   const float Specular[4] = { 0.0, 0.0, 1.0, 0.0 }; +   const float Emission[4] = { 0.0, 0.0, 0.0, 1.0 }; +   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient); +   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse); +   glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular); +   glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Emission); + + +   glGenProgramsARB(1, &prognum); + +   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum); +   glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, +		      strlen(prog1), (const GLubyte *) prog1); + +   assert(glIsProgramARB(prognum)); +   errno = glGetError(); +   printf("glGetError = %d\n", errno); +   if (errno != GL_NO_ERROR) +   { +      GLint errorpos; + +      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); +      printf("errorpos: %d\n", errorpos); +      printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)); +   } + +   glEnable(GL_VERTEX_PROGRAM_NV); + +} + + +static void Reshape(int width, int height) +{ + +    glViewport(0, 0, (GLint)width, (GLint)height); + +    glMatrixMode(GL_PROJECTION); +    glLoadIdentity(); +/*     glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); */ +    glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + +    switch (key) { +      case 27: +	exit(1); +      default: +	return; +    } + +    glutPostRedisplay(); +} + +static void Draw(void) +{ +   glClear(GL_COLOR_BUFFER_BIT);  + +   glBegin(GL_TRIANGLES); +   glColor3f(0,0,.7);  +   glVertex3f( 0.9, -0.9, -0.0); +   glColor3f(.8,0,0);  +   glVertex3f( 0.9,  0.9, -0.0); +   glColor3f(0,.9,0);  +   glVertex3f(-0.9,  0.0, -0.0); +   glEnd(); + +   glFlush(); + +   if (doubleBuffer) { +      glutSwapBuffers(); +   } +} + +static GLenum Args(int argc, char **argv) +{ +    GLint i; + +    doubleBuffer = GL_FALSE; + +    for (i = 1; i < argc; i++) { +        if (strcmp(argv[i], "-sb") == 0) { +	    doubleBuffer = GL_FALSE; +	} else if (strcmp(argv[i], "-db") == 0) { +	    doubleBuffer = GL_TRUE; +	} else { +	    fprintf(stderr, "%s (Bad option).\n", argv[i]); +	    return GL_FALSE; +	} +    } +    return GL_TRUE; +} + +int main(int argc, char **argv) +{ +    GLenum type; + +    glutInit(&argc, argv); + +    if (Args(argc, argv) == GL_FALSE) { +	exit(1); +    } + +    glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + +    type = GLUT_RGB | GLUT_ALPHA; +    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; +    glutInitDisplayMode(type); + +    if (glutCreateWindow("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/trivial/vp-tri-cb-tex.c b/progs/trivial/vp-tri-cb-tex.c new file mode 100644 index 0000000000..1e99d5b6ab --- /dev/null +++ b/progs/trivial/vp-tri-cb-tex.c @@ -0,0 +1,189 @@ +/* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */ + +#include <stdio.h> +#include <assert.h> +#include <string.h> +#include <stdlib.h> +#include <math.h> +#define GL_GLEXT_PROTOTYPES +#include <GL/glut.h> + + + +GLenum doubleBuffer; + +static void Init(void) +{ +   GLint errno; +   GLuint prognum; +    +   static const char *prog1 = +      "!!ARBvp1.0\n" +      "PARAM Emission = state.material.emission; \n" +      "PARAM Ambient = state.material.ambient; \n" +      "PARAM Diffuse = state.material.diffuse; \n" +      "PARAM Specular = state.material.specular; \n" +      "DP4  result.position.x, Ambient, vertex.position;\n" +      "DP4  result.position.y, Diffuse, vertex.position;\n" +      "DP4  result.position.z, Specular, vertex.position;\n" +      "DP4  result.position.w, Emission, vertex.position;\n" +      "MOV  result.texcoord[0], vertex.texcoord[0];\n" +      "END\n"; + +   const float Ambient[4] = { 0.0, 1.0, 0.0, 0.0 }; +   const float Diffuse[4] = { 1.0, 0.0, 0.0, 0.0 }; +   const float Specular[4] = { 0.0, 0.0, 1.0, 0.0 }; +   const float Emission[4] = { 0.0, 0.0, 0.0, 1.0 }; +   glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient); +   glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse); +   glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular); +   glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Emission); + + +   glGenProgramsARB(1, &prognum); + +   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum); +   glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, +		      strlen(prog1), (const GLubyte *) prog1); + +   assert(glIsProgramARB(prognum)); +   errno = glGetError(); +   printf("glGetError = %d\n", errno); +   if (errno != GL_NO_ERROR) +   { +      GLint errorpos; + +      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); +      printf("errorpos: %d\n", errorpos); +      printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)); +   } + +   glEnable(GL_VERTEX_PROGRAM_NV); + +#define SIZE 32 +   { +      GLubyte tex2d[SIZE][SIZE][3]; +      GLint s, t; + +      for (s = 0; s < SIZE; s++) { +	 for (t = 0; t < SIZE; t++) { +#if 0 +	    tex2d[t][s][0] = (s < SIZE/2) ? 0 : 255; +	    tex2d[t][s][1] = (t < SIZE/2) ? 0 : 255; +	    tex2d[t][s][2] = 0; +#else +	    tex2d[t][s][0] = s*255/(SIZE-1); +	    tex2d[t][s][1] = t*255/(SIZE-1); +	    tex2d[t][s][2] = 0; +#endif +	 } +      } + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + +      glTexImage2D(GL_TEXTURE_2D, 0, 3, SIZE, SIZE, 0, +                   GL_RGB, GL_UNSIGNED_BYTE, tex2d); + +      glEnable(GL_TEXTURE_2D); +      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +   } + +} + + +static void Reshape(int width, int height) +{ + +    glViewport(0, 0, (GLint)width, (GLint)height); + +    glMatrixMode(GL_PROJECTION); +    glLoadIdentity(); +/*     glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); */ +    glMatrixMode(GL_MODELVIEW); +} + +static void Key(unsigned char key, int x, int y) +{ + +    switch (key) { +      case 27: +	exit(1); +      default: +	return; +    } + +    glutPostRedisplay(); +} + +static void Draw(void) +{ +   glClear(GL_COLOR_BUFFER_BIT);  + +   glBegin(GL_TRIANGLES); +   glTexCoord2f(1,-1);  +   glVertex3f( 0.9, -0.9, -0.0); +   glTexCoord2f(1,1);  +   glVertex3f( 0.9,  0.9, -0.0); +   glTexCoord2f(-1,0);  +   glVertex3f(-0.9,  0.0, -0.0); +   glEnd(); + +   glFlush(); + +   if (doubleBuffer) { +      glutSwapBuffers(); +   } +} + +static GLenum Args(int argc, char **argv) +{ +    GLint i; + +    doubleBuffer = GL_FALSE; + +    for (i = 1; i < argc; i++) { +        if (strcmp(argv[i], "-sb") == 0) { +	    doubleBuffer = GL_FALSE; +	} else if (strcmp(argv[i], "-db") == 0) { +	    doubleBuffer = GL_TRUE; +	} else { +	    fprintf(stderr, "%s (Bad option).\n", argv[i]); +	    return GL_FALSE; +	} +    } +    return GL_TRUE; +} + +int main(int argc, char **argv) +{ +    GLenum type; + +    glutInit(&argc, argv); + +    if (Args(argc, argv) == GL_FALSE) { +	exit(1); +    } + +    glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); + +    type = GLUT_RGB | GLUT_ALPHA; +    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; +    glutInitDisplayMode(type); + +    if (glutCreateWindow("First Tri") == GL_FALSE) { +	exit(1); +    } + +    Init(); + +    glutReshapeFunc(Reshape); +    glutKeyboardFunc(Key); +    glutDisplayFunc(Draw); +    glutMainLoop(); +	return 0; +} diff --git a/progs/trivial/vp-tri-tex.c b/progs/trivial/vp-tri-tex.c new file mode 100644 index 0000000000..83ec1ef2e2 --- /dev/null +++ b/progs/trivial/vp-tri-tex.c @@ -0,0 +1,137 @@ +/* Test glGenProgramsNV(), glIsProgramNV(), glLoadProgramNV() */ + +#include <assert.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#define GL_GLEXT_PROTOTYPES +#include <GL/glut.h> + +static void Init( void ) +{ +   GLint errno; +   GLuint prognum; +    +   static const char *prog1 = +      "!!ARBvp1.0\n" +      "MOV  result.texcoord[0], vertex.texcoord[0];\n" +      "MOV  result.position, vertex.position;\n" +      "END\n"; + + +   glGenProgramsARB(1, &prognum); + +   glBindProgramARB(GL_VERTEX_PROGRAM_ARB, prognum); +   glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, +		      strlen(prog1), (const GLubyte *) prog1); + +   assert(glIsProgramARB(prognum)); +   errno = glGetError(); +   printf("glGetError = %d\n", errno); +   if (errno != GL_NO_ERROR) +   { +      GLint errorpos; + +      glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); +      printf("errorpos: %d\n", errorpos); +      printf("%s\n", (char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)); +   } + +#define SIZE 32 +   { +      GLubyte tex2d[SIZE][SIZE][3]; +      GLint s, t; + +      for (s = 0; s < SIZE; s++) { +	 for (t = 0; t < SIZE; t++) { +#if 0 +	    tex2d[t][s][0] = (s < SIZE/2) ? 0 : 255; +	    tex2d[t][s][1] = (t < SIZE/2) ? 0 : 255; +	    tex2d[t][s][2] = 0; +#else +	    tex2d[t][s][0] = s*255/(SIZE-1); +	    tex2d[t][s][1] = t*255/(SIZE-1); +	    tex2d[t][s][2] = 0; +#endif +	 } +      } + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + +      glTexImage2D(GL_TEXTURE_2D, 0, 3, SIZE, SIZE, 0, +                   GL_RGB, GL_UNSIGNED_BYTE, tex2d); + +      glEnable(GL_TEXTURE_2D); +      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + +      glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +   } + +} + +static void Display( void ) +{ +   glClearColor(0.3, 0.3, 0.3, 1); +   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + +   glEnable(GL_VERTEX_PROGRAM_NV); + +   glBegin(GL_TRIANGLES); +   glTexCoord2f(1,-1);  +   glVertex3f( 0.9, -0.9, -0.0); +   glTexCoord2f(1,1);  +   glVertex3f( 0.9,  0.9, -0.0); +   glTexCoord2f(-1,0);  +   glVertex3f(-0.9,  0.0, -0.0); +   glEnd(); + + +   glFlush();  +} + + +static void Reshape( int width, int height ) +{ +   glViewport( 0, 0, width, height ); +   glMatrixMode( GL_PROJECTION ); +   glLoadIdentity(); +   glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); +   glMatrixMode( GL_MODELVIEW ); +   glLoadIdentity(); +   /*glTranslatef( 0.0, 0.0, -15.0 );*/ +} + + +static void Key( unsigned char key, int x, int y ) +{ +   (void) x; +   (void) y; +   switch (key) { +      case 27: +         exit(0); +         break; +   } +   glutPostRedisplay(); +} + + + + +int main( int argc, char *argv[] ) +{ +   glutInit( &argc, argv ); +   glutInitWindowPosition( 0, 0 ); +   glutInitWindowSize( 250, 250 ); +   glutInitDisplayMode( GLUT_DEPTH | GLUT_RGB | GLUT_SINGLE ); +   glutCreateWindow(argv[0]); +   glutReshapeFunc( Reshape ); +   glutKeyboardFunc( Key ); +   glutDisplayFunc( Display ); +   Init(); +   glutMainLoop(); +   return 0; +} | 
