/******************************************* Demo Program to Load a Picture and Use it as a Texture The texture crawls across the polygon. Dannelly - October 2006 ********************************************/ #include #include #include #define ImageWidth 100 #define ImageHeight 71 GLubyte *MyImage; GLfloat spiny = 0.0; GLfloat spinz = 0.0; GLuint texName; GLfloat cy = 0.0; // texture crawl amount /**************************************************************/ void LoadImage() { FILE *infile; // open the image file infile = fopen("dannellys.raw","r"); if (infile == NULL) { perror ("Unable to Open RAW file\n\n"); exit (1); } // create space for image, then read from file MyImage = (GLubyte *) malloc (ImageHeight * ImageWidth * 3); fread (MyImage, ImageHeight*ImageWidth*3, 1, infile); fclose (infile); printf("done reading image file\n"); } /**************************************************************/ void init () { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); glEnable(GL_DEPTH_TEST); LoadImage(); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1, &texName); glBindTexture(GL_TEXTURE_2D, texName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ImageWidth, ImageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, MyImage); } /**************************************************************/ void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glBindTexture(GL_TEXTURE_2D, texName); glLoadIdentity(); glRotatef (spiny, 0.0,1.0,0.0); glRotatef (spinz, 0.0,0.0,1.0); glBegin(GL_POLYGON); // 0,0 on texture is upper-left on polygon glTexCoord2f(0.0, cy+1.0); glVertex3f(-20.0, -20.0, 0.0); glTexCoord2f(0.0, cy+0.0); glVertex3f(-20.0, 20.0, 0.0); glTexCoord2f(1.0, cy+0.0); glVertex3f( 20.0, 20.0, 0.0); glTexCoord2f(1.0, cy+1.0); glVertex3f( 20.0, -20.0, 0.0); glEnd(); glFlush(); glDisable(GL_TEXTURE_2D); } /******************************************************************/ void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50,50, -50,50, -50,50); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } /******************************************************************/ void keyboard (unsigned char key, int x, int y) { switch (key) { case 'q': exit(0); case 'c': cy += 0.1; glutPostRedisplay(); break; case 'y': spiny += 5.0; glutPostRedisplay(); break; case 'Y': spiny -= 5.0; glutPostRedisplay(); break; case 'z': spinz += 5.0; glutPostRedisplay(); break; case 'Z': spinz -= 5.0; glutPostRedisplay(); break; default: break; } } /******************************************************************/ int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }