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
3032001f49Smrg
3132001f49Smrg#define CI_OFFSET_1 16
3232001f49Smrg#define CI_OFFSET_2 32
3332001f49Smrg
3432001f49Smrg
3532001f49SmrgGLenum rgb, doubleBuffer;
3632001f49Smrg
3732001f49SmrgGLenum antiAlias, stipple;
3832001f49SmrgGLubyte stippleBits[32*4] = {
3932001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4032001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4132001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4232001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4332001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4432001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4532001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4632001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4732001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4832001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
4932001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
5032001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
5132001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
5232001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
5332001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
5432001f49Smrg    0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
5532001f49Smrg};
5632001f49Smrg
5732001f49Smrg
5832001f49Smrg#include "tkmap.c"
5932001f49Smrg
6032001f49Smrgstatic void Init(void)
6132001f49Smrg{
6232001f49Smrg    GLint i;
6332001f49Smrg
6432001f49Smrg    glClearColor(0.0, 0.0, 0.0, 0.0);
6532001f49Smrg    glClearIndex(0.0);
6632001f49Smrg
6732001f49Smrg    if (!rgb) {
6832001f49Smrg	for (i = 0; i < 16; i++) {
6932001f49Smrg	    glutSetColor(i+CI_OFFSET_1, 0.0, 0.0, i/15.0);
7032001f49Smrg	    glutSetColor(i+CI_OFFSET_2, 0.0, i/15.0, 0.0);
7132001f49Smrg	}
7232001f49Smrg    }
7332001f49Smrg
7432001f49Smrg    glPolygonStipple(stippleBits);
7532001f49Smrg
7632001f49Smrg    antiAlias = GL_FALSE;
7732001f49Smrg    stipple = GL_FALSE;
7832001f49Smrg}
7932001f49Smrg
8032001f49Smrgstatic void Reshape(int width, int height)
8132001f49Smrg{
8232001f49Smrg
8332001f49Smrg    glViewport(0, 0, (GLint)width, (GLint)height);
8432001f49Smrg
8532001f49Smrg    glMatrixMode(GL_PROJECTION);
8632001f49Smrg    glLoadIdentity();
8732001f49Smrg    glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
8832001f49Smrg    glMatrixMode(GL_MODELVIEW);
8932001f49Smrg}
9032001f49Smrg
9132001f49Smrgstatic void Key(unsigned char key, int x, int y)
9232001f49Smrg{
9332001f49Smrg
9432001f49Smrg    switch (key) {
9532001f49Smrg      case 27:
9632001f49Smrg	exit(1);
9732001f49Smrg      case '1':
9832001f49Smrg	antiAlias = !antiAlias;
9932001f49Smrg	break;
10032001f49Smrg      case '2':
10132001f49Smrg	stipple = !stipple;
10232001f49Smrg	break;
10332001f49Smrg      default:
10432001f49Smrg	return;
10532001f49Smrg    }
10632001f49Smrg
10732001f49Smrg    glutPostRedisplay();
10832001f49Smrg}
10932001f49Smrg
11032001f49Smrgstatic void Draw(void)
11132001f49Smrg{
11232001f49Smrg    GLint ci1, ci2;
11332001f49Smrg
11432001f49Smrg    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
11532001f49Smrg
11632001f49Smrg    if (antiAlias) {
11732001f49Smrg	ci1 = CI_OFFSET_1;
11832001f49Smrg	ci2 = CI_OFFSET_2;
11932001f49Smrg	glBlendFunc(GL_SRC_ALPHA, GL_ONE);
12032001f49Smrg	glEnable(GL_BLEND);
12132001f49Smrg	glEnable(GL_POLYGON_SMOOTH);
12232001f49Smrg	glDisable(GL_DEPTH_TEST);
12332001f49Smrg    } else {
12432001f49Smrg	ci1 = COLOR_BLUE;
12532001f49Smrg	ci2 = COLOR_GREEN;
12632001f49Smrg	glDisable(GL_BLEND);
12732001f49Smrg	glDisable(GL_POLYGON_SMOOTH);
12832001f49Smrg	glEnable(GL_DEPTH_TEST);
12932001f49Smrg    }
13032001f49Smrg
13132001f49Smrg    if (stipple) {
13232001f49Smrg	glEnable(GL_POLYGON_STIPPLE);
13332001f49Smrg    } else {
13432001f49Smrg	glDisable(GL_POLYGON_STIPPLE);
13532001f49Smrg    }
13632001f49Smrg
13732001f49Smrg    glBegin(GL_TRIANGLES);
13832001f49Smrg	(rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexi(ci1);
13932001f49Smrg	glVertex3f( 0.9, -0.9, -30.0);
14032001f49Smrg	glVertex3f( 0.9,  0.9, -30.0);
14132001f49Smrg	glVertex3f(-0.9,  0.0, -30.0);
14232001f49Smrg	(rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexi(ci2);
14332001f49Smrg	glVertex3f(-0.9, -0.9, -40.0);
14432001f49Smrg	glVertex3f(-0.9,  0.9, -40.0);
14532001f49Smrg	glVertex3f( 0.9,  0.0, -25.0);
14632001f49Smrg    glEnd();
14732001f49Smrg
14832001f49Smrg    glFlush();
14932001f49Smrg
15032001f49Smrg    if (doubleBuffer) {
15132001f49Smrg	glutSwapBuffers();
15232001f49Smrg    }
15332001f49Smrg}
15432001f49Smrg
15532001f49Smrgstatic GLenum Args(int argc, char **argv)
15632001f49Smrg{
15732001f49Smrg    GLint i;
15832001f49Smrg
15932001f49Smrg    rgb = GL_TRUE;
16032001f49Smrg    doubleBuffer = GL_FALSE;
16132001f49Smrg
16232001f49Smrg    for (i = 1; i < argc; i++) {
16332001f49Smrg	if (strcmp(argv[i], "-ci") == 0) {
16432001f49Smrg	    rgb = GL_FALSE;
16532001f49Smrg	} else if (strcmp(argv[i], "-rgb") == 0) {
16632001f49Smrg	    rgb = GL_TRUE;
16732001f49Smrg	} else if (strcmp(argv[i], "-sb") == 0) {
16832001f49Smrg	    doubleBuffer = GL_FALSE;
16932001f49Smrg	} else if (strcmp(argv[i], "-db") == 0) {
17032001f49Smrg	    doubleBuffer = GL_TRUE;
17132001f49Smrg	} else {
17232001f49Smrg	    printf("%s (Bad option).\n", argv[i]);
17332001f49Smrg	    return GL_FALSE;
17432001f49Smrg	}
17532001f49Smrg    }
17632001f49Smrg    return GL_TRUE;
17732001f49Smrg}
17832001f49Smrg
17932001f49Smrgint main(int argc, char **argv)
18032001f49Smrg{
18132001f49Smrg    GLenum type;
18232001f49Smrg
18332001f49Smrg    glutInit(&argc, argv);
18432001f49Smrg
18532001f49Smrg    if (Args(argc, argv) == GL_FALSE) {
18632001f49Smrg	exit(1);
18732001f49Smrg    }
18832001f49Smrg
18932001f49Smrg    glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
19032001f49Smrg
19132001f49Smrg    type = GLUT_DEPTH;
19232001f49Smrg    type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
19332001f49Smrg    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
19432001f49Smrg    glutInitDisplayMode(type);
19532001f49Smrg
19632001f49Smrg    if (glutCreateWindow("Depth Test") == GL_FALSE) {
19732001f49Smrg	exit(1);
19832001f49Smrg    }
19932001f49Smrg
20032001f49Smrg    InitMap();
20132001f49Smrg
20232001f49Smrg    Init();
20332001f49Smrg
20432001f49Smrg    glutReshapeFunc(Reshape);
20532001f49Smrg    glutKeyboardFunc(Key);
20632001f49Smrg    glutDisplayFunc(Draw);
20732001f49Smrg    glutMainLoop();
20832001f49Smrg	return 0;
20932001f49Smrg}
210