
/* 
 * texture map demo scaffolding
 *
 * FUNCTION:
 * Most of this code is required to set up OpenGL and GLUT
 *
 * HISTORY:
 * Written by Linas Vepstas, March 1995
 */

/* required include files */
#include <stdlib.h>
#include <GL/glut.h>
#include <GL/tube.h>
#include "texture.h"

/*  most recent mouse postion */
float lastx = 100.0;
float lasty = 100.0;

extern void InitStuff (void);
extern void DrawStuff (void);

/* get notified of mouse motions */
void MouseMotion (int x, int y)
{
   lastx = x;
   lasty = y;
   glutPostRedisplay ();
}

void TextureStyle (int msg) 
{
   int mode = 0;

   switch (msg) {
      case 301:
         glDisable (GL_TEXTURE_2D);
         break;
      case 302:
         glEnable (GL_TEXTURE_2D);
         break;

      case 501:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_FLAT;
         glMatrixMode (GL_TEXTURE); glLoadIdentity ();
         glScalef (0.1, 0.1, 1.0); glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 502:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_NORMAL_FLAT;
         glMatrixMode (GL_TEXTURE); glLoadIdentity ();
         glScalef (0.1, 0.1, 1.0); glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 503:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_CYL;
         glMatrixMode (GL_TEXTURE); glLoadIdentity ();
         glScalef (1.0, 0.1, 1.0); glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 504:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_NORMAL_CYL;
         glMatrixMode (GL_TEXTURE); glLoadIdentity ();
         glScalef (1.0, 0.1, 1.0); glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 505:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_SPH;
         glMatrixMode (GL_TEXTURE); glLoadIdentity (); 
         glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 506:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_NORMAL_SPH;
         glMatrixMode (GL_TEXTURE); glLoadIdentity (); 
         glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;

      case 507:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_MODEL_FLAT;
         glMatrixMode (GL_TEXTURE); glLoadIdentity ();
         glScalef (0.1, 0.1, 1.0); glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 508:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_NORMAL_MODEL_FLAT;
         glMatrixMode (GL_TEXTURE); glLoadIdentity ();
         glScalef (0.1, 0.1, 1.0); glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 509:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_MODEL_CYL;
         glMatrixMode (GL_TEXTURE); glLoadIdentity ();
         glScalef (1.0, 0.1, 1.0); glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 510:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_NORMAL_MODEL_CYL;
         glMatrixMode (GL_TEXTURE); glLoadIdentity ();
         glScalef (1.0, 0.1, 1.0); glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 511:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_MODEL_SPH;
         glMatrixMode (GL_TEXTURE); glLoadIdentity (); 
         glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;
      case 512:
         mode = GLE_TEXTURE_ENABLE | GLE_TEXTURE_NORMAL_MODEL_SPH;
         glMatrixMode (GL_TEXTURE); glLoadIdentity (); 
         glMatrixMode (GL_MODELVIEW);
         gleTextureMode (mode);
         break;

      case 701:
         current_texture = check_texture;
         gluBuild2DMipmaps (GL_TEXTURE_2D, 3, 
                      current_texture -> size,
                      current_texture -> size,
                      GL_RGB, GL_UNSIGNED_BYTE, 
                      (void *) (current_texture->pixmap));
         break;
      case 702:
         current_texture = barberpole_texture;
         gluBuild2DMipmaps (GL_TEXTURE_2D, 3, 
                      current_texture -> size,
                      current_texture -> size,
                      GL_RGB, GL_UNSIGNED_BYTE, 
                      (void *) (current_texture->pixmap));
         break;
      case 703:
         current_texture = wild_tooth_texture;
         gluBuild2DMipmaps (GL_TEXTURE_2D, 3, 
                      current_texture -> size,
                      current_texture -> size,
                      GL_RGB, GL_UNSIGNED_BYTE, 
                      (void *) (current_texture->pixmap));
         break;
      case 704:
         current_texture = planet_texture;
         gluBuild2DMipmaps (GL_TEXTURE_2D, 3, 
                      current_texture -> size,
                      current_texture -> size,
                      GL_RGB, GL_UNSIGNED_BYTE, 
                      (void *) (current_texture->pixmap));
         break;

      case 99:
         exit (0);
      default:
         break;
   }
   glutPostRedisplay();
}

/* set up a light */
GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0};
GLfloat lightOneColor[] = {0.99, 0.99, 0.99, 1.0}; 

GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0};
GLfloat lightTwoColor[] = {0.99, 0.99, 0.99, 1.0}; 

int
main (int argc, char * argv[]) {

   /* initialize glut */
   glutInit (&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutCreateWindow ("texture");
   glutDisplayFunc (DrawStuff);
   glutMotionFunc (MouseMotion);

   /* create popup menu */
   glutCreateMenu (TextureStyle);
   glutAddMenuEntry ("Texture Off", 301);
   glutAddMenuEntry ("Texture On", 302);
   glutAddMenuEntry ("--------------", 9999);
   glutAddMenuEntry ("Vertex Flat", 501);
   glutAddMenuEntry ("Normal Flat", 502);
   glutAddMenuEntry ("Vertex Cylinder", 503);
   glutAddMenuEntry ("Normal Cylinder", 504);
   glutAddMenuEntry ("Vertex Sphere", 505);
   glutAddMenuEntry ("Normal Sphere", 506);
   glutAddMenuEntry ("--------------", 9999);
   glutAddMenuEntry ("Model Vertex Flat", 507);
   glutAddMenuEntry ("Model Normal Flat", 508);
   glutAddMenuEntry ("Model Vertex Cylinder", 509);
   glutAddMenuEntry ("Model Normal Cylinder", 510);
   glutAddMenuEntry ("Model Vertex Sphere", 511);
   glutAddMenuEntry ("Model Normal Sphere", 512);
   glutAddMenuEntry ("--------------", 9999);
   glutAddMenuEntry ("Check Texture", 701);
   glutAddMenuEntry ("Barberpole Texture", 702);
   glutAddMenuEntry ("Wild Tooth Texture", 703);
   glutAddMenuEntry ("Molten Lava Texture", 704);
   glutAddMenuEntry ("--------------", 9999);
   glutAddMenuEntry ("Exit", 99);
   glutAttachMenu (GLUT_MIDDLE_BUTTON);

   /* initialize GL */
   glClearDepth (1.0);
   glEnable (GL_DEPTH_TEST);
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_SMOOTH);

   glMatrixMode (GL_PROJECTION);
   /* roughly, measured in centimeters */
   glFrustum (-9.0, 9.0, -9.0, 9.0, 50.0, 150.0);
   glMatrixMode(GL_MODELVIEW);

   /* initialize lighting */
   glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition);
   glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor);
   glEnable (GL_LIGHT0);
   glLightfv (GL_LIGHT1, GL_POSITION, lightTwoPosition);
   glLightfv (GL_LIGHT1, GL_DIFFUSE, lightTwoColor);
   glEnable (GL_LIGHT1);
   glEnable (GL_LIGHTING);
   glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE);
   glEnable (GL_COLOR_MATERIAL);
   glColor3f (0.8, 0.3, 0.6);

   /* initialize and enable texturing */
   setup_textures ();
   gluBuild2DMipmaps (GL_TEXTURE_2D, 3, 
                      current_texture -> size,
                      current_texture -> size,
                      GL_RGB, GL_UNSIGNED_BYTE, 
                      (void *) (current_texture->pixmap));

   glMatrixMode (GL_TEXTURE);
   glLoadIdentity ();
   glScalef (1.0, 0.1, 1.0);
   glMatrixMode (GL_MODELVIEW);

   glEnable (GL_TEXTURE_2D);
/*
   some stuff to play with ....
   glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
   glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
   glEnable (GL_TEXTURE_GEN_S);
   glEnable (GL_TEXTURE_GEN_T);
*/

   gleTextureMode (GLE_TEXTURE_ENABLE | GLE_TEXTURE_VERTEX_CYL);

   InitStuff ();

   glutMainLoop ();
   return 0;             /* ANSI C requires main to return int. */
}

/* -------------------- end of file -------------------- */
