fp-tri.c revision 7ec3b29a
1 2#include <stdio.h> 3#include <string.h> 4#include <stdlib.h> 5 6#ifndef WIN32 7#include <unistd.h> 8#include <signal.h> 9#endif 10 11#include <GL/glew.h> 12#include "glut_wrap.h" 13 14#include "readtex.c" 15 16 17#define TEXTURE_FILE DEMOS_DATA_DIR "bw.rgb" 18 19unsigned show_fps = 0; 20unsigned int frame_cnt = 0; 21void alarmhandler(int); 22static const char *filename = NULL; 23 24static void usage(char *name) 25{ 26 fprintf(stderr, "usage: %s [ options ] shader_filename\n", name); 27#ifndef WIN32 28 fprintf(stderr, "\n" ); 29 fprintf(stderr, "options:\n"); 30 fprintf(stderr, " -fps show frames per second\n"); 31#endif 32} 33 34#ifndef WIN32 35void alarmhandler (int sig) 36{ 37 if (sig == SIGALRM) { 38 printf("%d frames in 5.0 seconds = %.3f FPS\n", frame_cnt, 39 frame_cnt / 5.0); 40 41 frame_cnt = 0; 42 } 43 signal(SIGALRM, alarmhandler); 44 alarm(5); 45} 46#endif 47 48static void args(int argc, char *argv[]) 49{ 50 GLint i; 51 52 for (i = 1; i < argc; i++) { 53 if (strcmp(argv[i], "-fps") == 0) { 54 show_fps = 1; 55 } 56 else if (i == argc - 1) { 57 filename = argv[i]; 58 } 59 else { 60 usage(argv[0]); 61 exit(1); 62 } 63 } 64 65 if (!filename) { 66 usage(argv[0]); 67 exit(1); 68 } 69} 70 71static void Init( void ) 72{ 73 GLuint Texture; 74 GLint errnum; 75 GLuint prognum; 76 char buf[50000]; 77 GLuint sz; 78 FILE *f; 79 80 if ((f = fopen(filename, "r")) == NULL) { 81 fprintf(stderr, "Couldn't open %s\n", filename); 82 exit(1); 83 } 84 85 sz = fread(buf, 1, sizeof(buf), f); 86 if (!feof(f)) { 87 fprintf(stderr, "file too long\n"); 88 exit(1); 89 } 90 fprintf(stderr, "%.*s\n", sz, buf); 91 92 if (!GLEW_ARB_fragment_program) { 93 printf("Error: GL_ARB_fragment_program not supported!\n"); 94 exit(1); 95 } 96 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 97 98 /* Setup the fragment program */ 99 glGenProgramsARB(1, &prognum); 100 glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prognum); 101 glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 102 sz, (const GLubyte *)buf); 103 104 errnum = glGetError(); 105 printf("glGetError = 0x%x\n", errnum); 106 if (errnum != GL_NO_ERROR) { 107 GLint errorpos; 108 109 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorpos); 110 printf("errorpos: %d\n", errorpos); 111 printf("glError(GL_PROGRAM_ERROR_STRING_ARB) = %s\n", 112 (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB)); 113 } 114 glEnable(GL_FRAGMENT_PROGRAM_ARB); 115 116 117 /* Load texture */ 118 glGenTextures(1, &Texture); 119 glBindTexture(GL_TEXTURE_2D, Texture); 120 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 121 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 122 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 123 if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) { 124 printf("Error: couldn't load texture image file %s\n", TEXTURE_FILE); 125 exit(1); 126 } 127 128 129 glGenTextures(1, &Texture); 130 glActiveTextureARB(GL_TEXTURE0_ARB + 1); 131 glBindTexture(GL_TEXTURE_2D, Texture); 132 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 133 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 134 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 135 136 { 137 GLubyte data[32][32]; 138 int width = 32; 139 int height = 32; 140 int i; 141 int j; 142 143 for (i = 0; i < 32; i++) 144 for (j = 0; j < 32; j++) 145 { 146 /** 147 ** +-----------+ 148 ** | W | 149 ** | +-----+ | 150 ** | | | | 151 ** | | B | | 152 ** | | | | 153 ** | +-----+ | 154 ** | | 155 ** +-----------+ 156 **/ 157 int i2 = i - height / 2; 158 int j2 = j - width / 2; 159 int h8 = height / 8; 160 int w8 = width / 8; 161 if ( -h8 <= i2 && i2 <= h8 && -w8 <= j2 && j2 <= w8 ) { 162 data[i][j] = 0x00; 163 } else if ( -2 * h8 <= i2 && i2 <= 2 * h8 && -2 * w8 <= j2 && j2 <= 2 * w8 ) { 164 data[i][j] = 0x55; 165 } else if ( -3 * h8 <= i2 && i2 <= 3 * h8 && -3 * w8 <= j2 && j2 <= 3 * w8 ) { 166 data[i][j] = 0xaa; 167 } else { 168 data[i][j] = 0xff; 169 } 170 } 171 172 glTexImage2D( GL_TEXTURE_2D, 0, 173 GL_ALPHA8, 174 32, 32, 0, 175 GL_ALPHA, GL_UNSIGNED_BYTE, data ); 176 } 177 178 179 { 180 const float Ambient[4] = { 0.0, 1.0, 0.0, 0.0 }; 181 const float Diffuse[4] = { 1.0, 0.0, 0.0, 0.0 }; 182 const float Specular[4] = { 0.0, 0.0, 1.0, 0.0 }; 183 const float Emission[4] = { 0.0, 0.0, 0.0, 1.0 }; 184 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, Ambient); 185 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse); 186 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular); 187 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, Emission); 188 } 189 190 glClearColor(.1, .3, .5, 0); 191 fclose(f); 192} 193 194static void Reshape(int width, int height) 195{ 196 197 glViewport(0, 0, (GLint)width, (GLint)height); 198 199 glMatrixMode(GL_PROJECTION); 200 glLoadIdentity(); 201 glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0); 202 glMatrixMode(GL_MODELVIEW); 203} 204 205static void Key(unsigned char key, int x, int y) 206{ 207 208 switch (key) { 209 case 27: 210 exit(1); 211 default: 212 break; 213 } 214 215 glutPostRedisplay(); 216} 217 218static void Draw(void) 219{ 220 glClear(GL_COLOR_BUFFER_BIT); 221 222 glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, 1.0, 1.0, 0.0, 0.0); 223 glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, 0.0, 0.0, 1.0, 1.0); 224 glBegin(GL_TRIANGLES); 225 226 glColor3f(0,0,1); 227 glTexCoord3f(1,1,0); 228 glVertex3f( 0.9, -0.9, -30.0); 229 230 glColor3f(1,0,0); 231 glTexCoord3f(1,-1,0); 232 glVertex3f( 0.9, 0.9, -30.0); 233 234 glColor3f(0,1,0); 235 glTexCoord3f(-1,0,0); 236 glVertex3f(-0.9, 0.0, -30.0); 237 glEnd(); 238 239 glFlush(); 240 if (show_fps) { 241 ++frame_cnt; 242 glutPostRedisplay(); 243 } 244} 245 246 247int main(int argc, char **argv) 248{ 249 glutInit(&argc, argv); 250 glutInitWindowPosition(0, 0); 251 glutInitWindowSize(250, 250); 252 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH); 253 args(argc, argv); 254 glutCreateWindow(filename); 255 glewInit(); 256 glutReshapeFunc(Reshape); 257 glutKeyboardFunc(Key); 258 glutDisplayFunc(Draw); 259 Init(); 260#ifndef WIN32 261 if (show_fps) { 262 signal(SIGALRM, alarmhandler); 263 alarm(5); 264 } 265#endif 266 glutMainLoop(); 267 return 0; 268} 269