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 CI_RED COLOR_RED 32#define CI_ANTI_ALIAS_GREEN 16 33#define CI_ANTI_ALIAS_YELLOW 32 34#define CI_ANTI_ALIAS_RED 48 35 36 37GLenum rgb, doubleBuffer, windType; 38GLint windW, windH; 39 40#include "tkmap.c" 41 42GLenum mode; 43GLint size; 44float point[3] = { 45 1.0, 1.0, 0.0 46}; 47 48 49static void Init(void) 50{ 51 GLint i; 52 53 glClearColor(0.0, 0.0, 0.0, 0.0); 54 55 glBlendFunc(GL_SRC_ALPHA, GL_ZERO); 56 57 if (!rgb) { 58 for (i = 0; i < 16; i++) { 59 glutSetColor(i+CI_ANTI_ALIAS_RED, i/15.0, 0.0, 0.0); 60 glutSetColor(i+CI_ANTI_ALIAS_YELLOW, i/15.0, i/15.0, 0.0); 61 glutSetColor(i+CI_ANTI_ALIAS_GREEN, 0.0, i/15.0, 0.0); 62 } 63 } 64 65 mode = GL_FALSE; 66 size = 1; 67} 68 69static void Reshape(int width, int height) 70{ 71 72 windW = (GLint)width; 73 windH = (GLint)height; 74 75 glViewport(0, 0, width, height); 76 77 glMatrixMode(GL_PROJECTION); 78 glLoadIdentity(); 79 gluOrtho2D(-windW/2, windW/2, -windH/2, windH/2); 80 glMatrixMode(GL_MODELVIEW); 81} 82 83static void Key2(int key, int x, int y) 84{ 85 86 switch (key) { 87 case GLUT_KEY_LEFT: 88 point[0] -= 0.25; 89 break; 90 case GLUT_KEY_RIGHT: 91 point[0] += 0.25; 92 break; 93 case GLUT_KEY_UP: 94 point[1] += 0.25; 95 break; 96 case GLUT_KEY_DOWN: 97 point[1] -= 0.25; 98 break; 99 default: 100 return; 101 } 102 103 glutPostRedisplay(); 104} 105 106static void Key(unsigned char key, int x, int y) 107{ 108 109 switch (key) { 110 case 27: 111 exit(1); 112 case '1': 113 mode = !mode; 114 break; 115 case 'W': 116 size++; 117 break; 118 case 'w': 119 size--; 120 if (size < 1) { 121 size = 1; 122 } 123 break; 124 default: 125 return; 126 } 127 128 glutPostRedisplay(); 129} 130 131static void Draw(void) 132{ 133 134 glClear(GL_COLOR_BUFFER_BIT); 135 136 SetColor(COLOR_YELLOW); 137 glBegin(GL_LINE_STRIP); 138 glVertex2f(-windW/2, 0); 139 glVertex2f(windW/2, 0); 140 glEnd(); 141 glBegin(GL_LINE_STRIP); 142 glVertex2f(0, -windH/2); 143 glVertex2f(0, windH/2); 144 glEnd(); 145 146 if (mode) { 147 glEnable(GL_BLEND); 148 glEnable(GL_POINT_SMOOTH); 149 } else { 150 glDisable(GL_BLEND); 151 glDisable(GL_POINT_SMOOTH); 152 } 153 154 glPointSize(size); 155 if (mode) { 156 (rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_ANTI_ALIAS_RED); 157 } else { 158 (rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_RED); 159 } 160 glBegin(GL_POINTS); 161 glVertex3fv(point); 162 glEnd(); 163 164 glDisable(GL_POINT_SMOOTH); 165 glDisable(GL_BLEND); 166 167 glPointSize(1); 168 SetColor(COLOR_GREEN); 169 glBegin(GL_POINTS); 170 glVertex3fv(point); 171 glEnd(); 172 173 glFlush(); 174 175 if (doubleBuffer) { 176 glutSwapBuffers(); 177 } 178} 179 180static GLenum Args(int argc, char **argv) 181{ 182 GLint i; 183 184 rgb = GL_TRUE; 185 doubleBuffer = GL_FALSE; 186 187 for (i = 1; i < argc; i++) { 188 if (strcmp(argv[i], "-ci") == 0) { 189 rgb = GL_FALSE; 190 } else if (strcmp(argv[i], "-rgb") == 0) { 191 rgb = GL_TRUE; 192 } else if (strcmp(argv[i], "-sb") == 0) { 193 doubleBuffer = GL_FALSE; 194 } else if (strcmp(argv[i], "-db") == 0) { 195 doubleBuffer = GL_TRUE; 196 } else { 197 printf("%s (Bad option).\n", argv[i]); 198 return GL_FALSE; 199 } 200 } 201 return GL_TRUE; 202} 203 204int main(int argc, char **argv) 205{ 206 glutInit(&argc, argv); 207 208 if (Args(argc, argv) == GL_FALSE) { 209 exit(1); 210 } 211 212 windW = 300; 213 windH = 300; 214 glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH); 215 216 windType = (rgb) ? GLUT_RGB : GLUT_INDEX; 217 windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; 218 glutInitDisplayMode(windType); 219 220 if (glutCreateWindow("Point Test") == GL_FALSE) { 221 exit(1); 222 } 223 224 InitMap(); 225 226 Init(); 227 228 glutReshapeFunc(Reshape); 229 glutKeyboardFunc(Key); 230 glutSpecialFunc(Key2); 231 glutDisplayFunc(Draw); 232 glutMainLoop(); 233 return 0; 234} 235