tri-cull.c revision 32001f49
1/* 2 * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc. 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and 5 * its documentation for any purpose is hereby granted without fee, provided 6 * that (i) the above copyright notices and this permission notice appear in 7 * all copies of the software and related documentation, and (ii) the name of 8 * Silicon Graphics may not be used in any advertising or 9 * publicity relating to the software without the specific, prior written 10 * permission of Silicon Graphics. 11 * 12 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF 13 * ANY KIND, 14 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 15 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 16 * 17 * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR 18 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, 19 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 20 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 21 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 22 * OF THIS SOFTWARE. 23 */ 24 25#include <stdio.h> 26#include <string.h> 27#include <stdlib.h> 28#include "glut_wrap.h" 29 30static GLenum doubleBuffer; 31static GLint cullmode = 0; 32static GLenum front = GL_CCW; /* GL default */ 33 34static void cull(void) 35{ 36 cullmode = (cullmode + 1) % 4; 37 if (cullmode == 0) { 38 glCullFace(GL_FRONT); 39 glEnable(GL_CULL_FACE); 40 printf("cull GL_FRONT\n"); 41 } 42 else if (cullmode == 1) { 43 glCullFace(GL_BACK); 44 glEnable(GL_CULL_FACE); 45 printf("cull GL_BACK\n"); 46 } 47 else if (cullmode == 2) { 48 glCullFace(GL_FRONT_AND_BACK); 49 glEnable(GL_CULL_FACE); 50 printf("cull GL_FRONT_AND_BACK\n"); 51 } 52 else { 53 glDisable(GL_CULL_FACE); 54 printf("cull none\n"); 55 } 56} 57 58static void Init(void) 59{ 60 fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 61 fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); 62 fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); 63 fflush(stderr); 64 glClearColor(0.0, 0.0, 1.0, 1.0); 65 cull(); 66} 67 68static void Reshape(int width, int height) 69{ 70 glViewport(0, 0, (GLint)width, (GLint)height); 71 72 glMatrixMode(GL_PROJECTION); 73 glLoadIdentity(); 74 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); 75 glMatrixMode(GL_MODELVIEW); 76} 77 78static void Key(unsigned char key, int x, int y) 79{ 80 switch (key) { 81 case 27: 82 exit(1); 83 case 'c': 84 cull(); 85 break; 86 case 'f': 87 front = ((front == GL_CCW) ? GL_CW : GL_CCW); 88 glFrontFace(front); 89 printf("front face = %s\n", front == GL_CCW ? "GL_CCW" : "GL_CW"); 90 break; 91 default: 92 return; 93 } 94 glutPostRedisplay(); 95} 96 97static void Draw(void) 98{ 99 glClear(GL_COLOR_BUFFER_BIT); 100 101 glBegin(GL_TRIANGLES); 102 /* CCW / front-facing */ 103 glColor3f(0,0,.7); 104 glVertex3f(-0.1, -0.9, -30.0); 105 glColor3f(.8,0,0); 106 glVertex3f(-0.1, 0.9, -30.0); 107 glColor3f(0,.9,0); 108 glVertex3f(-0.9, 0.0, -30.0); 109 110 /* CW / back-facing */ 111 glColor3f(0,0,.7); 112 glVertex3f( 0.1, -0.9, -30.0); 113 glColor3f(.8,0,0); 114 glVertex3f( 0.1, 0.9, -30.0); 115 glColor3f(0,.9,0); 116 glVertex3f( 0.9, 0.0, -30.0); 117 118 glEnd(); 119 120 glFlush(); 121 122 if (doubleBuffer) { 123 glutSwapBuffers(); 124 } 125} 126 127static GLenum Args(int argc, char **argv) 128{ 129 GLint i; 130 131 doubleBuffer = GL_FALSE; 132 133 for (i = 1; i < argc; i++) { 134 if (strcmp(argv[i], "-sb") == 0) { 135 doubleBuffer = GL_FALSE; 136 } else if (strcmp(argv[i], "-db") == 0) { 137 doubleBuffer = GL_TRUE; 138 } else { 139 fprintf(stderr, "%s (Bad option).\n", argv[i]); 140 return GL_FALSE; 141 } 142 } 143 return GL_TRUE; 144} 145 146int main(int argc, char **argv) 147{ 148 GLenum type; 149 150 glutInit(&argc, argv); 151 152 if (Args(argc, argv) == GL_FALSE) { 153 exit(1); 154 } 155 156 glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250); 157 158 type = GLUT_RGB | GLUT_ALPHA; 159 type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; 160 glutInitDisplayMode(type); 161 162 if (glutCreateWindow(*argv) == GL_FALSE) { 163 exit(1); 164 } 165 166 Init(); 167 168 glutReshapeFunc(Reshape); 169 glutKeyboardFunc(Key); 170 glutDisplayFunc(Draw); 171 glutMainLoop(); 172 return 0; 173} 174