tri.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 30 31#define SOLID 1 32#define LINE 2 33#define POINT 3 34 35 36GLenum rgb, doubleBuffer, windType; 37GLint windW, windH; 38 39GLenum dithering = GL_TRUE; 40GLenum showVerticies = GL_TRUE; 41GLenum hideBottomTriangle = GL_FALSE; 42GLenum outline = GL_TRUE; 43GLenum culling = GL_FALSE; 44GLenum winding = GL_FALSE; 45GLenum face = GL_FALSE; 46GLenum state = SOLID; 47GLenum aaMode = GL_FALSE; 48GLenum shade = GL_TRUE; 49 50GLint color1, color2, color3; 51 52float zRotation = 90.0; 53float zoom = 1.0; 54 55float boxA[3] = {-100, -100, 0}; 56float boxB[3] = { 100, -100, 0}; 57float boxC[3] = { 100, 100, 0}; 58float boxD[3] = {-100, 100, 0}; 59 60float p0[3] = {-125,-80, 0}; 61float p1[3] = {-125, 80, 0}; 62float p2[3] = { 172, 0, 0}; 63 64 65#include "tkmap.c" 66 67static void Init(void) 68{ 69 float r, g, b; 70 float percent1, percent2; 71 GLint i, j; 72 73 glClearColor(0.0, 0.0, 0.0, 0.0); 74 75 glLineStipple(1, 0xF0F0); 76 77 glEnable(GL_SCISSOR_TEST); 78 79 if (!rgb) { 80 for (j = 0; j <= 12; j++) { 81 if (j <= 6) { 82 percent1 = j / 6.0; 83 r = 1.0 - 0.8 * percent1; 84 g = 0.2 + 0.8 * percent1; 85 b = 0.2; 86 } else { 87 percent1 = (j - 6) / 6.0; 88 r = 0.2; 89 g = 1.0 - 0.8 * percent1; 90 b = 0.2 + 0.8 * percent1; 91 } 92 glutSetColor(j+18, r, g, b); 93 for (i = 0; i < 16; i++) { 94 percent2 = i / 15.0; 95 glutSetColor(j*16+1+32, r*percent2, g*percent2, b*percent2); 96 } 97 } 98 color1 = 18; 99 color2 = 24; 100 color3 = 30; 101 } 102} 103 104static void Reshape(int width, int height) 105{ 106 107 windW = (GLint)width; 108 windH = (GLint)height; 109} 110 111static void Key2(int key, int x, int y) 112{ 113 114 switch (key) { 115 case GLUT_KEY_LEFT: 116 zRotation += 0.5; 117 break; 118 case GLUT_KEY_RIGHT: 119 zRotation -= 0.5; 120 break; 121 default: 122 return; 123 } 124 125 glutPostRedisplay(); 126} 127 128static void Key(unsigned char key, int x, int y) 129{ 130 131 switch (key) { 132 case 27: 133 exit(1); 134 case 'Z': 135 zoom *= 0.75; 136 break; 137 case 'z': 138 zoom /= 0.75; 139 if (zoom > 10) { 140 zoom = 10; 141 } 142 break; 143 case '1': 144 glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); 145 break; 146 case '2': 147 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 148 break; 149 case '3': 150 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 151 break; 152 case '4': 153 state = POINT; 154 break; 155 case '5': 156 state = LINE; 157 break; 158 case '6': 159 state = SOLID; 160 break; 161 case '7': 162 culling = !culling; 163 break; 164 case '8': 165 winding = !winding; 166 break; 167 case '9': 168 face = !face; 169 break; 170 case 'v': 171 showVerticies = !showVerticies; 172 break; 173 case 's': 174 shade = !shade; 175 (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT); 176 break; 177 case 'h': 178 hideBottomTriangle = !hideBottomTriangle; 179 break; 180 case 'o': 181 outline = !outline; 182 break; 183 case 'm': 184 dithering = !dithering; 185 break; 186 case '0': 187 aaMode = !aaMode; 188 if (aaMode) { 189 glEnable(GL_POLYGON_SMOOTH); 190 glEnable(GL_BLEND); 191 glBlendFunc(GL_SRC_ALPHA, GL_ONE); 192 if (!rgb) { 193 color1 = 32; 194 color2 = 128; 195 color3 = 224; 196 } 197 } else { 198 glDisable(GL_POLYGON_SMOOTH); 199 glDisable(GL_BLEND); 200 if (!rgb) { 201 color1 = 18; 202 color2 = 24; 203 color3 = 30; 204 } 205 } 206 break; 207 default: 208 return; 209 } 210 211 glutPostRedisplay(); 212} 213 214static void BeginPrim(void) 215{ 216 217 switch (state) { 218 case SOLID: 219 glBegin(GL_POLYGON); 220 break; 221 case LINE: 222 glBegin(GL_LINE_LOOP); 223 break; 224 case POINT: 225 glBegin(GL_POINTS); 226 break; 227 default: 228 break; 229 } 230} 231 232static void EndPrim(void) 233{ 234 235 glEnd(); 236} 237 238static void Draw(void) 239{ 240 float scaleX, scaleY; 241 242 glViewport(0, 0, windW, windH); 243 244 glMatrixMode(GL_PROJECTION); 245 glLoadIdentity(); 246 gluOrtho2D(-175, 175, -175, 175); 247 glMatrixMode(GL_MODELVIEW); 248 249 glScissor(0, 0, windW, windH); 250 251 (culling) ? glEnable(GL_CULL_FACE) : glDisable(GL_CULL_FACE); 252 (winding) ? glFrontFace(GL_CCW) : glFrontFace(GL_CW); 253 (face) ? glCullFace(GL_FRONT) : glCullFace(GL_BACK); 254 255 (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER); 256 257 glClear(GL_COLOR_BUFFER_BIT); 258 259 SetColor(COLOR_GREEN); 260 glBegin(GL_LINE_LOOP); 261 glVertex3fv(boxA); 262 glVertex3fv(boxB); 263 glVertex3fv(boxC); 264 glVertex3fv(boxD); 265 glEnd(); 266 267 if (!hideBottomTriangle) { 268 glPushMatrix(); 269 270 glScalef(zoom, zoom, zoom); 271 glRotatef(zRotation, 0, 0, 1); 272 273 SetColor(COLOR_BLUE); 274 BeginPrim(); 275 glVertex3fv(p0); 276 glVertex3fv(p1); 277 glVertex3fv(p2); 278 EndPrim(); 279 280 if (showVerticies) { 281 (rgb) ? glColor3fv(RGBMap[COLOR_RED]) : glIndexf(color1); 282 glRectf(p0[0]-2, p0[1]-2, p0[0]+2, p0[1]+2); 283 (rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexf(color2); 284 glRectf(p1[0]-2, p1[1]-2, p1[0]+2, p1[1]+2); 285 (rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexf(color3); 286 glRectf(p2[0]-2, p2[1]-2, p2[0]+2, p2[1]+2); 287 } 288 289 glPopMatrix(); 290 } 291 292 scaleX = (float)(windW - 20) / 2 / 175 * (175 - 100) + 10; 293 scaleY = (float)(windH - 20) / 2 / 175 * (175 - 100) + 10; 294 295 glViewport(scaleX, scaleY, windW-2*scaleX, windH-2*scaleY); 296 297 glMatrixMode(GL_PROJECTION); 298 glLoadIdentity(); 299 gluOrtho2D(-100, 100, -100, 100); 300 glMatrixMode(GL_MODELVIEW); 301 302 glScissor(scaleX, scaleY, windW-2*scaleX, windH-2*scaleY); 303 304 glPushMatrix(); 305 306 glScalef(zoom, zoom, zoom); 307 glRotatef(zRotation, 0,0,1); 308 309 glPointSize(10); 310 glLineWidth(5); 311 glEnable(GL_POINT_SMOOTH); 312 glEnable(GL_LINE_STIPPLE); 313 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 314 315 SetColor(COLOR_RED); 316 BeginPrim(); 317 (rgb) ? glColor3fv(RGBMap[COLOR_RED]) : glIndexf(color1); 318 glVertex3fv(p0); 319 (rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexf(color2); 320 glVertex3fv(p1); 321 (rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexf(color3); 322 glVertex3fv(p2); 323 EndPrim(); 324 325 glPointSize(1); 326 glLineWidth(1); 327 glDisable(GL_POINT_SMOOTH); 328 glDisable(GL_LINE_STIPPLE); 329 glBlendFunc(GL_ONE, GL_ZERO); 330 331 if (outline) { 332 SetColor(COLOR_WHITE); 333 glBegin(GL_LINE_LOOP); 334 glVertex3fv(p0); 335 glVertex3fv(p1); 336 glVertex3fv(p2); 337 glEnd(); 338 } 339 340 glPopMatrix(); 341 342 glFlush(); 343 344 if (doubleBuffer) { 345 glutSwapBuffers(); 346 } 347} 348 349static GLenum Args(int argc, char **argv) 350{ 351 GLint i; 352 353 rgb = GL_TRUE; 354 doubleBuffer = GL_FALSE; 355 356 for (i = 1; i < argc; i++) { 357 if (strcmp(argv[i], "-ci") == 0) { 358 rgb = GL_FALSE; 359 } else if (strcmp(argv[i], "-rgb") == 0) { 360 rgb = GL_TRUE; 361 } else if (strcmp(argv[i], "-sb") == 0) { 362 doubleBuffer = GL_FALSE; 363 } else if (strcmp(argv[i], "-db") == 0) { 364 doubleBuffer = GL_TRUE; 365 } else { 366 printf("%s (Bad option).\n", argv[i]); 367 return GL_FALSE; 368 } 369 } 370 return GL_TRUE; 371} 372 373int main(int argc, char **argv) 374{ 375 glutInit(&argc, argv); 376 377 if (Args(argc, argv) == GL_FALSE) { 378 exit(1); 379 } 380 381 windW = 600; 382 windH = 300; 383 glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH); 384 385 windType = (rgb) ? GLUT_RGB : GLUT_INDEX; 386 windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; 387 glutInitDisplayMode(windType); 388 389 if (glutCreateWindow("Triangle Test") == GL_FALSE) { 390 exit(1); 391 } 392 393 InitMap(); 394 395 Init(); 396 397 glutReshapeFunc(Reshape); 398 glutKeyboardFunc(Key); 399 glutSpecialFunc(Key2); 400 glutDisplayFunc(Draw); 401 glutMainLoop(); 402 return 0; 403} 404