/* Simplest demo of reading in an image and texture-mapping it onto something; in this case, a cube. Scott D. Anderson Fall 2003 */ #include #include #include // for printf #include // for exit #include char* filename; void texinit() { glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); twTex2D(filename,true); } int obj=0; // the current kind of object void display() { twDisplayInit(); twCamera(); glPushAttrib(GL_ALL_ATTRIB_BITS); glEnable(GL_TEXTURE_2D); switch(obj) { case 0: // this is a *square*, so the aspect ratio may not match the texture's AR glBegin(GL_QUADS); glTexCoord2f(0,1); glVertex3f( -1,-1,0); glTexCoord2f(1,1); glVertex3f( 1,-1,0); glTexCoord2f(1,0); glVertex3f( 1, 1,0); glTexCoord2f(0,0); glVertex3f( -1, 1,0); glEnd(); break; case 1: glutSolidTeapot(1); break; case 2: { GLfloat sgenparams1[] = {0,0,0.5,0.5}; GLfloat sgenparams2[] = {0,0.5,0,0.5}; glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_S,GL_OBJECT_PLANE,sgenparams1); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_T,GL_OBJECT_PLANE,sgenparams2); glPushMatrix(); glutSolidCube(2); glPopMatrix(); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); break; } case 3: { GLfloat sgenparams1[] = {1,0,0,0}; GLfloat sgenparams2[] = {0,1,1,0}; glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_S,GL_OBJECT_PLANE,sgenparams1); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGenfv(GL_T,GL_OBJECT_PLANE,sgenparams2); twSolidCylinder(1,0.5,1,20,20); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); break; } } glPopAttrib(); glFlush(); glutSwapBuffers(); } void newObj(unsigned char, int, int) { obj = (obj+1)%4; glutPostRedisplay(); } int main(int argc, char **argv) { if(argc < 2) { printf("Usage: %s ppm-image-file-name\n",argv[0]); exit(0); } else { filename=argv[1]; } glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); twInitWindowSize(500, 500); glutCreateWindow(argv[0]); glutDisplayFunc(display); twBoundingBox(-1,+1,-1,+1,-1,1); twMainInit(); twKeyCallback('o',newObj,"try a different object"); texinit(); glutMainLoop(); }