#include #include #include "GL/glut.h" #define TIMER 33 GLUquadric *myQuad; static float xrot; #define TMMODE_NONE 1 #define TMMODE_SINGLE 2 #define TMMODE_TWOPASS 3 #ifdef GL_HP_texture_lighting #define TMMODE_HPEXT 4 #endif /* GL_HP_texture_lighting */ static int tmMode; #define USE_ALPHA_TEST 10 static int alphaTest = 0; static GLuint textures[2]; static void display( void ) { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity (); gluLookAt (0., 0., 5., 0., 0., 0., 0., 1., 0.); glRotatef (xrot, 1., 0., 0.); glTranslatef (0., 0., -1.); /* Only pass or first of two passes */ gluCylinder (myQuad, .5, .5, 2., 24, 8); if (tmMode == TMMODE_TWOPASS) { GLfloat white[4] = {1., 1., 1., 1.}; /* second pass here */ glPushAttrib (GL_ALL_ATTRIB_BITS); glColor3f (0., 0., 0.); glDepthFunc (GL_LEQUAL); glEnable (GL_BLEND); glLightfv (GL_LIGHT1, GL_SPECULAR, white); glBindTexture (GL_TEXTURE_2D, textures[1]); gluCylinder (myQuad, .5, .5, 2., 24, 8); glPopAttrib (); /* Bug! Should have popped... */ glBindTexture (GL_TEXTURE_2D, textures[0]); } glFlush(); glutSwapBuffers(); } void reshape(int w, int h) { glViewport (0, 0, w, h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (50., (float)w/(float)h, 1., 20.); /* Leave us in modelview mode for our display routine */ glMatrixMode(GL_MODELVIEW); } static void cbMainMenu (int value) { GLfloat white[4] = {1., 1., 1., 1.}; GLfloat black[4] = {0., 0., 0., 0.}; if (value == 99) { exit (0); } if (value < USE_ALPHA_TEST) tmMode = value; switch (value) { case TMMODE_NONE: { glDisable (GL_TEXTURE_2D); glLightfv (GL_LIGHT1, GL_SPECULAR, white); break; } case TMMODE_SINGLE: { glEnable (GL_TEXTURE_2D); glLightfv (GL_LIGHT1, GL_SPECULAR, white); #ifdef GL_HP_texture_lighting glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_LIGHTING_MODE_HP, GL_TEXTURE_POST_SPECULAR_HP); #endif /* GL_HP_texture_lighting */ break; } case TMMODE_TWOPASS: { glEnable (GL_TEXTURE_2D); glLightfv (GL_LIGHT1, GL_SPECULAR, black); #ifdef GL_HP_texture_lighting glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_LIGHTING_MODE_HP, GL_TEXTURE_POST_SPECULAR_HP); #endif /* GL_HP_texture_lighting */ break; } #ifdef GL_HP_texture_lighting case TMMODE_HPEXT: { glEnable (GL_TEXTURE_2D); glLightfv (GL_LIGHT1, GL_SPECULAR, white); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_LIGHTING_MODE_HP, GL_TEXTURE_PRE_SPECULAR_HP); break; } #endif /* GL_HP_texture_lighting */ case USE_ALPHA_TEST: { alphaTest = ~alphaTest; if (alphaTest) glEnable (GL_ALPHA_TEST); else glDisable (GL_ALPHA_TEST); break; } } } static void timer (int value) { xrot += 1.f; if (xrot > 360.f) xrot -= 360.f; glutPostRedisplay (); glutTimerFunc (TIMER, timer, 0); } static void initTextureMap (int w, int h, unsigned char *tm) { int i, j, ci=w>>2, cj=h>>2; for (i=0; i