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 <GL/glew.h> 29#include "glut_wrap.h" 30 31 32#define CI_OFFSET_1 16 33#define CI_OFFSET_2 32 34 35#define SIZE 16 36GLenum doubleBuffer; 37GLint line = 0; 38 39static void MakeImage(void) 40{ 41 GLubyte tex2d[SIZE][SIZE][3]; 42 GLint s, t; 43 44 for (s = 0; s < SIZE; s++) { 45 for (t = 0; t < SIZE; t++) { 46 tex2d[t][s][0] = s*255/(SIZE-1); 47 tex2d[t][s][1] = t*255/(SIZE-1); 48 tex2d[t][s][2] = 0*255/(SIZE-1); 49 } 50 } 51 52 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 53 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 54 SIZE, SIZE, 55 0, 56 GL_RGB, GL_UNSIGNED_BYTE, tex2d); 57 glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 58 glEnable(GL_TEXTURE_2D); 59} 60 61static void UpdateLine(void) 62{ 63 GLubyte tex[SIZE][3]; 64 GLubyte b = 0; 65 GLint s, t; 66 67 t = line % SIZE; 68 if (line % (SIZE * 2) < SIZE) 69 b = 255; 70 else 71 b = 0; 72 73 for (s = 0; s < SIZE; s++) { 74 tex[s][0] = s*255/(SIZE-1); 75 tex[s][1] = t*255/(SIZE-1); 76 tex[s][2] = b; 77 } 78 79 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 80 glTexSubImage2D(GL_TEXTURE_2D, 0, 81 0, t, 82 SIZE, 1, 83 GL_RGB, GL_UNSIGNED_BYTE, tex); 84 glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 85} 86 87static void Init(void) 88{ 89 fprintf(stderr, "GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 90 fprintf(stderr, "GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); 91 fprintf(stderr, "GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR)); 92 fflush(stderr); 93 94 glClearColor(0.0, 0.0, 1.0, 0.0); 95 96 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 97 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 98 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 99 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 100 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 101 102 MakeImage(); 103 UpdateLine(); 104 line++; 105} 106 107static void Reshape(int width, int height) 108{ 109 110 glViewport(0, 0, (GLint)width, (GLint)height); 111 112 glMatrixMode(GL_PROJECTION); 113 glLoadIdentity(); 114 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); 115 glMatrixMode(GL_MODELVIEW); 116} 117 118static void Key(unsigned char key, int x, int y) 119{ 120 121 switch (key) { 122 case 27: 123 exit(1); 124 default: 125 UpdateLine(); 126 line++; 127 break; 128 } 129 130 glutPostRedisplay(); 131} 132 133static void Draw(void) 134{ 135 glClear(GL_COLOR_BUFFER_BIT); 136 137 glBegin(GL_QUADS); 138 glTexCoord2f(1,0); 139 glVertex3f( 0.9, -0.9, -30.0); 140 glTexCoord2f(1,1); 141 glVertex3f( 0.9, 0.9, -30.0); 142 glTexCoord2f(0,1); 143 glVertex3f(-0.9, 0.9, -30.0); 144 glTexCoord2f(0,0); 145 glVertex3f(-0.9, -0.9, -30.0); 146 glEnd(); 147 148 glFlush(); 149 150 if (doubleBuffer) { 151 glutSwapBuffers(); 152 } 153} 154 155static GLenum Args(int argc, char **argv) 156{ 157 GLint i; 158 159 doubleBuffer = GL_FALSE; 160 161 for (i = 1; i < argc; i++) { 162 if (strcmp(argv[i], "-sb") == 0) { 163 doubleBuffer = GL_FALSE; 164 } else if (strcmp(argv[i], "-db") == 0) { 165 doubleBuffer = GL_TRUE; 166 } else { 167 fprintf(stderr, "%s (Bad option).\n", argv[i]); 168 return GL_FALSE; 169 } 170 } 171 return GL_TRUE; 172} 173 174int main(int argc, char **argv) 175{ 176 GLenum type; 177 178 glutInit(&argc, argv); 179 180 if (Args(argc, argv) == GL_FALSE) { 181 exit(1); 182 } 183 184 glutInitWindowPosition(0, 0); 185 glutInitWindowSize(250, 250); 186 187 type = GLUT_RGB | GLUT_ALPHA; 188 type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE; 189 glutInitDisplayMode(type); 190 191 if (glutCreateWindow(*argv) == GL_FALSE) { 192 exit(1); 193 } 194 195 glewInit(); 196 197 Init(); 198 199 glutReshapeFunc(Reshape); 200 glutKeyboardFunc(Key); 201 glutDisplayFunc(Draw); 202 glutMainLoop(); 203 return 0; 204} 205