/* Demo of the classic barn object, augmented with an animation of the peak growing to form a kind of "steeple." Implemented Fall 2003 Scott D. Anderson */ #include #include const int barnWidth =30; const int barnHeight=40; const int barnLength=50; twTriple barn[10] = { {0,0,0}, //left, bottom, front {barnWidth,0,0}, // right, bottom, front {barnWidth,barnHeight,0}, // right, top, front {0,barnHeight,0}, // left, top, front {barnWidth/2.0,barnHeight+barnWidth/2.0,0}, // ridge, front {0,0,-barnLength}, // left, bottom, back {barnWidth,0,-barnLength}, // right, bottom, back {barnWidth,barnHeight,-barnLength}, //right, top, back {0,barnHeight,-barnLength}, // left, top, back {barnWidth/2.0,barnHeight+barnWidth/2.0,-barnLength},// ridge, back }; // Almost every facet is a different color so that we can see them. void drawBarn(GLfloat steepleHeight) { // Use steeple instead of barn[4] twTriple steeple = {barnWidth/2.0, steepleHeight, 0}; twColorName(TW_RED); // set color to red glBegin(GL_POLYGON); // front { glVertex3fv(barn[0]); glVertex3fv(barn[1]); glVertex3fv(barn[2]); glVertex3fv(barn[3]); } glEnd(); glBegin(GL_POLYGON); // front ridge { glVertex3fv(barn[3]); glVertex3fv(barn[2]); glVertex3fv(steeple); } glEnd(); twColorName(TW_GREEN); glBegin(GL_POLYGON); // back { glVertex3fv(barn[5]); glVertex3fv(barn[6]); glVertex3fv(barn[7]); glVertex3fv(barn[8]); } glEnd(); glBegin(GL_POLYGON); // back ridge { glVertex3fv(barn[7]); glVertex3fv(barn[8]); glVertex3fv(barn[9]); } glEnd(); twColorName(TW_PURPLE); glBegin(GL_POLYGON); // left side { glVertex3fv(steeple); glVertex3fv(barn[3]); glVertex3fv(barn[8]); glVertex3fv(barn[5]); } glEnd(); twColorName(TW_MAROON); glBegin(GL_POLYGON); // right side { glVertex3fv(barn[1]); glVertex3fv(barn[2]); glVertex3fv(barn[7]); glVertex3fv(barn[6]); } glEnd(); twColorName(TW_OLIVE); glBegin(GL_POLYGON); // left side roof { glVertex3fv(barn[3]); glVertex3fv(steeple); glVertex3fv(barn[9]); glVertex3fv(barn[8]); } glEnd(); glBegin(GL_POLYGON); /* right side roof */ { glVertex3fv(barn[2]); glVertex3fv(steeple); glVertex3fv(barn[9]); glVertex3fv(barn[7]); } glEnd(); } int FrameNumber=-1; // no animation, yet const int WinSize = 500; void saveFrame() { char file[20]; sprintf(file, "animationLab%03d.ppm", FrameNumber++); twSaveFrame(WinSize, WinSize, file, 0); } bool SaveFrames = false; GLfloat steepleheight = barnHeight+barnWidth/2.0; void display(void) { twDisplayInit(); twCamera(); drawBarn(steepleheight); if(SaveFrames) saveFrame(); glFlush(); glutSwapBuffers(); } bool Grow = false; void grow(void) { steepleheight += 0.01; glutPostRedisplay(); } void keys(unsigned char k, int x, int y) { switch (k) { case '1': SaveFrames = !SaveFrames; if(SaveFrames) FrameNumber = 1; break; case '2': Grow = !Grow; if(Grow) glutIdleFunc(grow); else glutIdleFunc(NULL); break; case '3': grow(); break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); twInitWindowSize(WinSize,WinSize); glutCreateWindow(argv[0]); glutDisplayFunc(display); twBoundingBox(0,barnWidth,0,barnHeight*2,-barnLength,0); twMainInit(); twKeyCallback('1',keys,"toggle saving frames"); twKeyCallback('2',keys,"toggle animation"); twKeyCallback('3',keys,"one frame"); glutMainLoop(); return 0; }