/* Puts up a fence around the barn. Demonstrates display lists and affine transforms. Written by Caroline Geiersbach and Scott D. Anderson scott.anderson@acm.org Summer 2003 */ #include #include #include #include #define barnWidth 30 #define barnHeight 40 #define barnLength 50 twTriple barn[10] = { {0,0,0}, // left, bottom, front {1,0,0}, // right, bottom, front {1,1,0}, // right, top, front {0,1,0}, // left, top, front {0.5,1.5,0}, // ridge, front {0,0,-1}, // left, bottom, back {1,0,-1}, // right, bottom, back {1,1,-1}, // right, top, back {0,1,-1}, // left, top, back {0.5,1.5,-1}, // ridge, back }; void drawBarn(int frontBack, int sides, int roof) { int i; twColorName(frontBack); // set color for front and back of barn 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(barn[4]); } glEnd(); 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(sides); // set color for sides glBegin(GL_POLYGON); // left side { glVertex3fv(barn[0]); glVertex3fv(barn[3]); glVertex3fv(barn[8]); glVertex3fv(barn[5]); } glEnd(); glBegin(GL_POLYGON); // right side { glVertex3fv(barn[1]); glVertex3fv(barn[2]); glVertex3fv(barn[7]); glVertex3fv(barn[6]); } glEnd(); twColorName(roof); // set color for roof glBegin(GL_POLYGON); // left side roof { glVertex3fv(barn[3]); glVertex3fv(barn[4]); glVertex3fv(barn[9]); glVertex3fv(barn[8]); } glEnd(); glBegin(GL_POLYGON); // right side roof { glVertex3fv(barn[2]); glVertex3fv(barn[4]); glVertex3fv(barn[9]); glVertex3fv(barn[7]); } glEnd(); } twTriple rail [] = { {0,0,0}, {5,0,0}, {5,3,0}, {0,3,0} }; void drawRail () { glBegin(GL_POLYGON); { glVertex3fv(rail[0]); glVertex3fv(rail[1]); glVertex3fv(rail[2]); glVertex3fv(rail[3]); } glEnd(); } // Arbitrary numeric identifier for this call list. #define PICKET 100 void drawInit() { /* Create a call list for one picket of the fence */ glNewList(PICKET, GL_COMPILE); glPushMatrix(); glScalef(4,10,2); // must scale to create 4*10*2 barn drawBarn(TW_MAROON, TW_BLACK, TW_ORANGE); glPopMatrix(); glPushMatrix(); twColorName(TW_OLIVE); glTranslatef(-0.5,2,-1); drawRail(); glTranslatef(0,5,0); drawRail(); glPopMatrix(); glEndList(); } void display(void) { int i; twDisplayInit(); twCamera(); // draw ground twGround(TW_GREEN); // draw front fence glPushMatrix(); glTranslatef(-40,0,0); for(i=0;i<20;i++) { glCallList(PICKET); glTranslatef(5,0,0); } glPopMatrix(); // draw right side fence glPushMatrix(); glTranslatef(60,0,0); glRotatef(90,0,1,0); for(i=0;i<25;i++) { glCallList(PICKET); glTranslatef(5,0,0); } glPopMatrix(); // draw left side fence glPushMatrix(); glTranslatef(-40,0,0); glRotatef(90,0,1,0); for(i=0;i<25;i++) { glCallList(PICKET); glTranslatef(5,0,0); } // draw barn glPopMatrix(); glPushMatrix(); glTranslatef(0,0,-40); glScalef(35,40,50); drawBarn(TW_TEAL,TW_DARK_BLUE,TW_CYAN); glPopMatrix(); glFlush(); glutSwapBuffers(); // necessary for animation } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); twInitWindowSize(500,500); glutCreateWindow(argv[0]); drawInit(); glutDisplayFunc(display); twBoundingBox(-40,60,0,60,-125,0); twMainInit(); glutMainLoop(); return 0; }