132001f49Smrg
232001f49Smrg/*
332001f49Smrg * A skeleton/template GLUT program
432001f49Smrg *
532001f49Smrg * Written by Brian Paul and in the public domain.
632001f49Smrg */
732001f49Smrg
832001f49Smrg
932001f49Smrg/*
1032001f49Smrg * Revision 1.1  2001/08/21 14:25:31  brianp
1132001f49Smrg * simple multi-window GLUT test prog
1232001f49Smrg *
1332001f49Smrg * Revision 1.1.1.1  1999/08/19 00:55:42  jtg
1432001f49Smrg * Imported sources
1532001f49Smrg *
1632001f49Smrg * Revision 1.2  1998/11/07 14:20:14  brianp
1732001f49Smrg * added simple rotation, animation of cube
1832001f49Smrg *
1932001f49Smrg * Revision 1.1  1998/11/07 14:14:37  brianp
2032001f49Smrg * Initial revision
2132001f49Smrg *
2232001f49Smrg */
2332001f49Smrg
2432001f49Smrg
2532001f49Smrg#include <stdio.h>
2632001f49Smrg#include <stdlib.h>
2732001f49Smrg#include <math.h>
2832001f49Smrg#include <GL/glew.h>
2932001f49Smrg#include "glut_wrap.h"
3032001f49Smrg
3132001f49Smrg
3232001f49Smrgstatic GLint Window[2];
3332001f49Smrg
3432001f49Smrgstatic GLfloat Xrot = 0, Yrot = 0, Zrot = 0;
3532001f49Smrgstatic GLboolean Anim = GL_TRUE;
3632001f49Smrg
3732001f49Smrg
3832001f49Smrgstatic void Idle( void )
3932001f49Smrg{
4032001f49Smrg   Xrot += 3.0;
4132001f49Smrg   Yrot += 4.0;
4232001f49Smrg   Zrot += 2.0;
4332001f49Smrg
4432001f49Smrg   glutSetWindow(Window[0]);
4532001f49Smrg   glutPostRedisplay();
4632001f49Smrg   glutSetWindow(Window[1]);
4732001f49Smrg   glutPostRedisplay();
4832001f49Smrg}
4932001f49Smrg
5032001f49Smrg
5132001f49Smrgstatic void Display0( void )
5232001f49Smrg{
5332001f49Smrg   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
5432001f49Smrg
5532001f49Smrg   glEnable(GL_LIGHTING);
5632001f49Smrg   glEnable(GL_LIGHT0);
5732001f49Smrg   glEnable(GL_DEPTH_TEST);
5832001f49Smrg
5932001f49Smrg   glPushMatrix();
6032001f49Smrg   glRotatef(Xrot, 1, 0, 0);
6132001f49Smrg   glRotatef(Yrot, 0, 1, 0);
6232001f49Smrg   glRotatef(Zrot, 0, 0, 1);
6332001f49Smrg
6432001f49Smrg   glColor3f(0, 1, 0);
6532001f49Smrg   glutSolidCube(2.0);
6632001f49Smrg
6732001f49Smrg   glPopMatrix();
6832001f49Smrg
6932001f49Smrg   glutSwapBuffers();
7032001f49Smrg}
7132001f49Smrg
7232001f49Smrg
7332001f49Smrgstatic void Display1( void )
7432001f49Smrg{
7532001f49Smrg   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
7632001f49Smrg
7732001f49Smrg   glPushMatrix();
7832001f49Smrg   glRotatef(Xrot, 1, 0, 0);
7932001f49Smrg   glRotatef(Yrot, 0, 1, 0);
8032001f49Smrg   glRotatef(Zrot, 0, 0, 1);
8132001f49Smrg
8232001f49Smrg   glShadeModel(GL_FLAT);
8332001f49Smrg
8432001f49Smrg   glBegin(GL_TRIANGLE_STRIP);
8532001f49Smrg   glColor3f(1, 0, 0);
8632001f49Smrg   glVertex2f(-1, -1);
8732001f49Smrg   glVertex2f( 1, -1);
8832001f49Smrg   glColor3f(1, 0, 0);
8932001f49Smrg   glVertex2f( -1, 1);
9032001f49Smrg   glColor3f(0, 0, 1);
9132001f49Smrg   glVertex2f( 1, 1);
9232001f49Smrg   glEnd();
9332001f49Smrg
9432001f49Smrg   glPopMatrix();
9532001f49Smrg
9632001f49Smrg   glutSwapBuffers();
9732001f49Smrg}
9832001f49Smrg
9932001f49Smrg
10032001f49Smrgstatic void Reshape( int width, int height )
10132001f49Smrg{
10232001f49Smrg   glViewport( 0, 0, width, height );
10332001f49Smrg   glMatrixMode( GL_PROJECTION );
10432001f49Smrg   glLoadIdentity();
10532001f49Smrg   glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
10632001f49Smrg   glMatrixMode( GL_MODELVIEW );
10732001f49Smrg   glLoadIdentity();
10832001f49Smrg   glTranslatef( 0.0, 0.0, -15.0 );
10932001f49Smrg}
11032001f49Smrg
11132001f49Smrg
11232001f49Smrgstatic void Key( unsigned char key, int x, int y )
11332001f49Smrg{
11432001f49Smrg   const GLfloat step = 3.0;
11532001f49Smrg   (void) x;
11632001f49Smrg   (void) y;
11732001f49Smrg   switch (key) {
11832001f49Smrg      case 'a':
11932001f49Smrg         Anim = !Anim;
12032001f49Smrg         if (Anim)
12132001f49Smrg            glutIdleFunc(Idle);
12232001f49Smrg         else
12332001f49Smrg            glutIdleFunc(NULL);
12432001f49Smrg         break;
12532001f49Smrg      case 'z':
12632001f49Smrg         Zrot -= step;
12732001f49Smrg         break;
12832001f49Smrg      case 'Z':
12932001f49Smrg         Zrot += step;
13032001f49Smrg         break;
13132001f49Smrg      case 27:
13232001f49Smrg         exit(0);
13332001f49Smrg         break;
13432001f49Smrg   }
13532001f49Smrg   glutPostRedisplay();
13632001f49Smrg}
13732001f49Smrg
13832001f49Smrg
13932001f49Smrg
14032001f49Smrg
14132001f49Smrgint main( int argc, char *argv[] )
14232001f49Smrg{
14332001f49Smrg   glutInit( &argc, argv );
14432001f49Smrg
14532001f49Smrg   glutInitWindowPosition( 0, 0 );
14632001f49Smrg   glutInitWindowSize( 400, 400 );
14732001f49Smrg   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
14832001f49Smrg   Window[0] = glutCreateWindow(argv[0]);
14932001f49Smrg   glewInit();
15032001f49Smrg   glutReshapeFunc( Reshape );
15132001f49Smrg   glutKeyboardFunc( Key );
15232001f49Smrg   glutDisplayFunc( Display0 );
15332001f49Smrg   glutIdleFunc(Idle);
15432001f49Smrg   printf("GL_RENDERER[0] = %s\n", (char *) glGetString(GL_RENDERER));
15532001f49Smrg
15632001f49Smrg   glutInitWindowPosition( 500, 0 );
15732001f49Smrg   glutInitWindowSize( 400, 400 );
15832001f49Smrg   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
15932001f49Smrg   Window[1] = glutCreateWindow(argv[0]);
16032001f49Smrg   glewInit();
16132001f49Smrg   glutReshapeFunc( Reshape );
16232001f49Smrg   glutKeyboardFunc( Key );
16332001f49Smrg   glutDisplayFunc( Display1 );
16432001f49Smrg   glutIdleFunc(Idle);
16532001f49Smrg   printf("GL_RENDERER[1] = %s\n", (char *) glGetString(GL_RENDERER));
16632001f49Smrg
16732001f49Smrg   glutMainLoop();
16832001f49Smrg
16932001f49Smrg   return 0;
17032001f49Smrg}
171