/* Demo of texture mapping onto a triangle Implemented Fall 2003 Scott D. Anderson */ #include #include // for exit #include void textureInit(char* imgfile) { 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); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); twPPM_Tex2D(imgfile,true); } void display(void) { twDisplayInit(); twCamera(); glEnable(GL_TEXTURE_2D); // the standard glBegin(GL_QUADS); glTexCoord2f(0,1); glVertex2f(0,0); glTexCoord2f(0,0); glVertex2f(0,2); glTexCoord2f(1,0); glVertex2f(1,2); glTexCoord2f(1,1); glVertex2f(1,0); glEnd(); // cut out glPushMatrix(); glTranslatef(1,0,0); glBegin(GL_TRIANGLES); glTexCoord2f(0,1); glVertex2f(0,0); glTexCoord2f(0.5,0); glVertex2f(0.5,2); glTexCoord2f(1,1); glVertex2f(1,0); glEnd(); glPopMatrix(); // warped glPushMatrix(); glTranslatef(2,0,0); glBegin(GL_QUADS); glTexCoord2f(0,1); glVertex2f(0,0); glTexCoord2f(0,0); glVertex2f(0.40,2); glTexCoord2f(1,0); glVertex2f(0.60,2); glTexCoord2f(1,1); glVertex2f(1,0); glEnd(); glPopMatrix(); // warped with interior vertices and lines glPushMatrix(); glTranslatef(3,0,0); GLfloat vcp[] = {0,0,0, 0.5,2,0, 1,0,0, 0.5,2,0}; GLfloat tcp[] = {0,1, 0,0, 1,1, 1,0}; const int steps = 10; glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 2, 0, 1, 6, 2, vcp); glEnable(GL_MAP2_VERTEX_3); glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, tcp); glEnable(GL_MAP2_TEXTURE_COORD_2); glMapGrid2f(steps,0,1,steps,0,1); glEvalMesh2(GL_LINE,0,steps,0,steps); glPopMatrix(); // warped with interior vertices and fill glPushMatrix(); glTranslatef(4,0,0); glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 2, 0, 1, 6, 2, vcp); glEnable(GL_MAP2_VERTEX_3); glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, tcp); glEnable(GL_MAP2_TEXTURE_COORD_2); glMapGrid2f(steps,0,1,steps,0,1); glEvalMesh2(GL_FILL,0,steps,0,steps); glPopMatrix(); glFlush(); glutSwapBuffers(); } int main(int argc, char** argv) { if(argc != 2) { printf("Usage: %s imageFile\n",argv[0]); exit(0); } glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); twInitWindowSize(1000,400); glutCreateWindow(argv[0]); glutDisplayFunc(display); twBoundingBox(0,5,0,2,0,0); twMainInit(); textureInit(argv[1]); glutMainLoop(); return 0; }