132001f49Smrg/*
232001f49Smrg * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
332001f49Smrg *
432001f49Smrg * Permission to use, copy, modify, distribute, and sell this software and
532001f49Smrg * its documentation for any purpose is hereby granted without fee, provided
632001f49Smrg * that (i) the above copyright notices and this permission notice appear in
732001f49Smrg * all copies of the software and related documentation, and (ii) the name of
832001f49Smrg * Silicon Graphics may not be used in any advertising or
932001f49Smrg * publicity relating to the software without the specific, prior written
1032001f49Smrg * permission of Silicon Graphics.
1132001f49Smrg *
1232001f49Smrg * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
1332001f49Smrg * ANY KIND,
1432001f49Smrg * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
1532001f49Smrg * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1632001f49Smrg *
1732001f49Smrg * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
1832001f49Smrg * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
1932001f49Smrg * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
2032001f49Smrg * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
2132001f49Smrg * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
2232001f49Smrg * OF THIS SOFTWARE.
2332001f49Smrg */
2432001f49Smrg
2532001f49Smrg#include <stdio.h>
2632001f49Smrg#include <string.h>
2732001f49Smrg#include <stdlib.h>
2832001f49Smrg#include "glut_wrap.h"
2932001f49Smrg
3032001f49SmrgGLenum doubleBuffer = 1;
3132001f49Smrgint win;
3232001f49Smrgstatic float tx = 0;
3332001f49Smrgstatic float ty = 0;
3432001f49Smrgstatic float tw = 0;
3532001f49Smrgstatic float th = 0;
3632001f49Smrgstatic float z = -5;
3732001f49Smrg
3832001f49Smrg
3932001f49Smrgstatic float win_width = 250;
4032001f49Smrgstatic float win_height = 250;
4132001f49Smrgstatic enum {
4232001f49Smrg   ORTHO,
4332001f49Smrg   FRUSTUM,
4432001f49Smrg   MODE_MAX
4532001f49Smrg} mode = ORTHO;
4632001f49Smrg
4732001f49Smrgstatic void Init(void)
4832001f49Smrg{
4932001f49Smrg   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
5032001f49Smrg   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
5132001f49Smrg   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
5232001f49Smrg   fflush(stderr);
5332001f49Smrg
5432001f49Smrg   glClearColor(0, 0, 0, 0.0);
5532001f49Smrg}
5632001f49Smrg
5732001f49Smrgstatic void Reshape(int width, int height)
5832001f49Smrg{
5932001f49Smrg   win_width = width;
6032001f49Smrg   win_height = height;
6132001f49Smrg   glutPostRedisplay();
6232001f49Smrg}
6332001f49Smrg
6432001f49Smrg
6532001f49Smrgstatic void Key(unsigned char key, int x, int y)
6632001f49Smrg{
6732001f49Smrg   switch (key) {
6832001f49Smrg   case 27:
6932001f49Smrg      exit(0);
7032001f49Smrg   case 'w':
7132001f49Smrg      tw += 1.0;
7232001f49Smrg      break;
7332001f49Smrg   case 'W':
7432001f49Smrg      tw -= 1.0;
7532001f49Smrg      break;
7632001f49Smrg   case 'h':
7732001f49Smrg      th += 1.0;
7832001f49Smrg      break;
7932001f49Smrg   case 'H':
8032001f49Smrg      th -= 1.0;
8132001f49Smrg      break;
8232001f49Smrg
8332001f49Smrg   case 'z':
8432001f49Smrg      z += 1.0;
8532001f49Smrg      break;
8632001f49Smrg   case 'Z':
8732001f49Smrg      z -= 1.0;
8832001f49Smrg      break;
8932001f49Smrg   case 'm':
9032001f49Smrg      mode++;
9132001f49Smrg      mode %= MODE_MAX;
9232001f49Smrg      break;
9332001f49Smrg   case ' ':
9432001f49Smrg      tw = th = tx = ty = 0;
9532001f49Smrg      z = -5;
9632001f49Smrg      mode = ORTHO;
9732001f49Smrg      break;
9832001f49Smrg   default:
9932001f49Smrg      break;
10032001f49Smrg   }
10132001f49Smrg   glutPostRedisplay();
10232001f49Smrg}
10332001f49Smrg
10432001f49Smrg
10532001f49Smrgstatic void Draw(void)
10632001f49Smrg{
10732001f49Smrg   int i;
10832001f49Smrg   float w = tw + win_width;
10932001f49Smrg   float h = th + win_height;
11032001f49Smrg
11132001f49Smrg   fprintf(stderr, "glViewport(%f %f %f %f)\n", tx, ty, w, h);
11232001f49Smrg   fprintf(stderr, "mode: %s\n", mode == FRUSTUM ? "FRUSTUM" : "ORTHO");
11332001f49Smrg   fprintf(stderr, "z: %f\n", z);
11432001f49Smrg   fflush(stderr);
11532001f49Smrg
11632001f49Smrg   glMatrixMode(GL_PROJECTION);
11732001f49Smrg   glLoadIdentity();
11832001f49Smrg
11932001f49Smrg   switch (mode) {
12032001f49Smrg   case FRUSTUM:
12132001f49Smrg      glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
12232001f49Smrg      break;
12332001f49Smrg   case ORTHO:
12432001f49Smrg   default:
12532001f49Smrg      glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
12632001f49Smrg      break;
12732001f49Smrg   }
12832001f49Smrg
12932001f49Smrg   glMatrixMode(GL_MODELVIEW);
13032001f49Smrg   glLoadIdentity();
13132001f49Smrg
13232001f49Smrg
13332001f49Smrg   glClear(GL_COLOR_BUFFER_BIT);
13432001f49Smrg
13532001f49Smrg
13632001f49Smrg   /***********************************************************************
13732001f49Smrg    * Should be clipped to be no larger than the triangles:
13832001f49Smrg    */
13932001f49Smrg   glViewport(tx, ty, w, h);
14032001f49Smrg
14132001f49Smrg   glBegin(GL_POLYGON);
14232001f49Smrg   glColor3f(1,1,0);
14332001f49Smrg   glVertex3f(-100, -100, z);
14432001f49Smrg   glVertex3f(-100, 100, z);
14532001f49Smrg   glVertex3f(100, 100, z);
14632001f49Smrg   glVertex3f(100, -100, z);
14732001f49Smrg   glEnd();
14832001f49Smrg
14932001f49Smrg   glBegin(GL_POLYGON);
15032001f49Smrg   glColor3f(0,1,1);
15132001f49Smrg   glVertex3f(-10, -10, z);
15232001f49Smrg   glVertex3f(-10, 10, z);
15332001f49Smrg   glVertex3f(10, 10, z);
15432001f49Smrg   glVertex3f(10, -10, z);
15532001f49Smrg   glEnd();
15632001f49Smrg
15732001f49Smrg   glBegin(GL_POLYGON);
15832001f49Smrg   glColor3f(1,0,0);
15932001f49Smrg   glVertex3f(-2, -2, z);
16032001f49Smrg   glVertex3f(-2, 2, z);
16132001f49Smrg   glVertex3f(2, 2, z);
16232001f49Smrg   glVertex3f(2, -2, z);
16332001f49Smrg   glEnd();
16432001f49Smrg
16532001f49Smrg
16632001f49Smrg   glBegin(GL_POLYGON);
16732001f49Smrg   glColor3f(.5,.5,1);
16832001f49Smrg   glVertex3f(-1, -1, z);
16932001f49Smrg   glVertex3f(-1, 1, z);
17032001f49Smrg   glVertex3f(1, 1, z);
17132001f49Smrg   glVertex3f(1, -1, z);
17232001f49Smrg   glEnd();
17332001f49Smrg
17432001f49Smrg   /***********************************************************************
17532001f49Smrg    */
17632001f49Smrg   glViewport(0, 0, win_width, win_height);
17732001f49Smrg   glBegin(GL_LINES);
17832001f49Smrg   glColor3f(1,1,0);
17932001f49Smrg   glVertex3f(-1, 0, z);
18032001f49Smrg   glVertex3f(1, 0, z);
18132001f49Smrg
18232001f49Smrg   glVertex3f(0,  -1, z);
18332001f49Smrg   glVertex3f(0,  1, z);
18432001f49Smrg   glEnd();
18532001f49Smrg
18632001f49Smrg
18732001f49Smrg   /***********************************************************************
18832001f49Smrg    */
18932001f49Smrg   glViewport(tx, ty, w, h);
19032001f49Smrg   glBegin(GL_TRIANGLES);
19132001f49Smrg   glColor3f(1,0,0);
19232001f49Smrg   glVertex3f(-1, -1, z);
19332001f49Smrg   glVertex3f(0, -1, z);
19432001f49Smrg   glVertex3f(-.5,  -.5, z);
19532001f49Smrg
19632001f49Smrg   glColor3f(1,1,1);
19732001f49Smrg   glVertex3f(0, -1, z);
19832001f49Smrg   glVertex3f(1, -1, z);
19932001f49Smrg   glVertex3f(.5,  -.5, z);
20032001f49Smrg
20132001f49Smrg   glVertex3f(-.5, -.5, z);
20232001f49Smrg   glVertex3f(.5, -.5, z);
20332001f49Smrg   glVertex3f(0,  0, z);
20432001f49Smrg
20532001f49Smrg
20632001f49Smrg   glColor3f(0,1,0);
20732001f49Smrg   glVertex3f(1, 1, z);
20832001f49Smrg   glVertex3f(0, 1, z);
20932001f49Smrg   glVertex3f(.5,  .5, z);
21032001f49Smrg
21132001f49Smrg   glColor3f(1,1,1);
21232001f49Smrg   glVertex3f(0, 1, z);
21332001f49Smrg   glVertex3f(-1, 1, z);
21432001f49Smrg   glVertex3f(-.5,  .5, z);
21532001f49Smrg
21632001f49Smrg   glVertex3f(.5, .5, z);
21732001f49Smrg   glVertex3f(-.5, .5, z);
21832001f49Smrg   glVertex3f( 0,  0, z);
21932001f49Smrg
22032001f49Smrg   glEnd();
22132001f49Smrg
22232001f49Smrg
22332001f49Smrg   glViewport(0, 0, win_width, win_height);
22432001f49Smrg
22532001f49Smrg   glBegin(GL_LINES);
22632001f49Smrg   glColor3f(.5,.5,0);
22732001f49Smrg   for (i = -10; i < 10; i++) {
22832001f49Smrg      float f = i / 10.0;
22932001f49Smrg
23032001f49Smrg      if (i == 0)
23132001f49Smrg         continue;
23232001f49Smrg
23332001f49Smrg      glVertex3f(-1, f, z);
23432001f49Smrg      glVertex3f(1, f, z);
23532001f49Smrg
23632001f49Smrg      glVertex3f(f, -1, z);
23732001f49Smrg      glVertex3f(f, 1, z);
23832001f49Smrg   }
23932001f49Smrg   glEnd();
24032001f49Smrg
24132001f49Smrg
24232001f49Smrg
24332001f49Smrg   glFlush();
24432001f49Smrg
24532001f49Smrg   if (doubleBuffer) {
24632001f49Smrg      glutSwapBuffers();
24732001f49Smrg   }
24832001f49Smrg}
24932001f49Smrg
25032001f49Smrgstatic GLenum Args(int argc, char **argv)
25132001f49Smrg{
25232001f49Smrg   GLint i;
25332001f49Smrg
25432001f49Smrg   if (getenv("VPX"))
25532001f49Smrg      tx = atof(getenv("VPX"));
25632001f49Smrg
25732001f49Smrg   if (getenv("VPY"))
25832001f49Smrg      ty = atof(getenv("VPY"));
25932001f49Smrg
26032001f49Smrg
26132001f49Smrg   for (i = 1; i < argc; i++) {
26232001f49Smrg      if (strcmp(argv[i], "-sb") == 0) {
26332001f49Smrg         doubleBuffer = GL_FALSE;
26432001f49Smrg      } else if (strcmp(argv[i], "-db") == 0) {
26532001f49Smrg         doubleBuffer = GL_TRUE;
26632001f49Smrg      } else {
26732001f49Smrg         fprintf(stderr, "%s (Bad option).\n", argv[i]);
26832001f49Smrg         return GL_FALSE;
26932001f49Smrg      }
27032001f49Smrg   }
27132001f49Smrg   return GL_TRUE;
27232001f49Smrg}
27332001f49Smrg
27432001f49Smrg
27532001f49Smrgstatic void
27632001f49Smrgspecial(int k, int x, int y)
27732001f49Smrg{
27832001f49Smrg   switch (k) {
27932001f49Smrg   case GLUT_KEY_UP:
28032001f49Smrg      ty += 1.0;
28132001f49Smrg      break;
28232001f49Smrg   case GLUT_KEY_DOWN:
28332001f49Smrg      ty -= 1.0;
28432001f49Smrg      break;
28532001f49Smrg   case GLUT_KEY_LEFT:
28632001f49Smrg      tx -= 1.0;
28732001f49Smrg      break;
28832001f49Smrg   case GLUT_KEY_RIGHT:
28932001f49Smrg      tx += 1.0;
29032001f49Smrg      break;
29132001f49Smrg   default:
29232001f49Smrg      break;
29332001f49Smrg   }
29432001f49Smrg   glutPostRedisplay();
29532001f49Smrg}
29632001f49Smrg
29732001f49Smrg
29832001f49Smrgint main(int argc, char **argv)
29932001f49Smrg{
30032001f49Smrg   GLenum type;
30132001f49Smrg
30232001f49Smrg   glutInit(&argc, argv);
30332001f49Smrg
30432001f49Smrg   if (Args(argc, argv) == GL_FALSE) {
30532001f49Smrg      exit(1);
30632001f49Smrg   }
30732001f49Smrg
30832001f49Smrg   glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250);
30932001f49Smrg
31032001f49Smrg   type = GLUT_RGB | GLUT_ALPHA;
31132001f49Smrg   type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
31232001f49Smrg   glutInitDisplayMode(type);
31332001f49Smrg
31432001f49Smrg   win = glutCreateWindow(*argv);
31532001f49Smrg   if (!win) {
31632001f49Smrg      exit(1);
31732001f49Smrg   }
31832001f49Smrg
31932001f49Smrg   Init();
32032001f49Smrg
32132001f49Smrg   glutReshapeFunc(Reshape);
32232001f49Smrg   glutKeyboardFunc(Key);
32332001f49Smrg   glutSpecialFunc(special);
32432001f49Smrg   glutDisplayFunc(Draw);
32532001f49Smrg   glutMainLoop();
32632001f49Smrg   return 0;
32732001f49Smrg}
328