/* stairs2.c by G.S.Adhar */ #include #include #include float corners[6][3] = {{5,0,0}, {5,2,0}, {-5,2,0}, {-5,0,0}, {-5,2,-2}, {5,2,-2}}; void OneStep() { glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glColor3f(0.0,0.0,0.0); glBegin(GL_POLYGON); glVertex3fv(corners[0]); glVertex3fv(corners[1]); glVertex3fv(corners[2]); glVertex3fv(corners[3]); glEnd(); glBegin(GL_QUADS); glVertex3fv(corners[1]); glVertex3fv(corners[2]); glVertex3fv(corners[4]); glVertex3fv(corners[5]); glEnd(); glBegin(GL_TRIANGLES); glVertex3fv(corners[0]); glVertex3fv(corners[1]); glVertex3fv(corners[5]); glEnd(); glBegin(GL_TRIANGLES); glVertex3fv(corners[3]); glVertex3fv(corners[2]); glVertex3fv(corners[4]); glEnd(); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor3f(1.0,1.0,1.0); glBegin(GL_POLYGON); glVertex3fv(corners[0]); glVertex3fv(corners[1]); glVertex3fv(corners[2]); glVertex3fv(corners[3]); glEnd(); glBegin(GL_QUADS); glVertex3fv(corners[1]); glVertex3fv(corners[2]); glVertex3fv(corners[4]); glVertex3fv(corners[5]); glEnd(); glBegin(GL_TRIANGLES); glVertex3fv(corners[0]); glVertex3fv(corners[1]); glVertex3fv(corners[5]); glEnd(); glBegin(GL_TRIANGLES); glVertex3fv(corners[3]); glVertex3fv(corners[2]); glVertex3fv(corners[4]); glEnd(); } void stairs() { int i; for (i =0; i < 8; i++) { OneStep(); glTranslatef(0, 2, -2); glRotatef(25, 0,1,0); } } static GLfloat theta[] = {0.0,0.0,0.0}; static GLint axis = 2; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(25, 1.0, 0.0, 0.0); glRotatef(theta[1], 0.0, 1.0, 0.0); stairs(); glFlush(); glutSwapBuffers(); } void spinStairs() { /* Idle callback, spin cube 2 degrees about selected axis */ theta[axis] += 2.0; if( theta[axis] > 360.0 ) theta[axis] -= 360.0; /* display(); */ glutPostRedisplay(); } void mouse(int btn, int state, int x, int y) { /* mouse callback, selects an axis about which to rotate */ if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) theta[1]+=2; if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) glutIdleFunc(spinStairs); glutPostRedisplay(); } void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-20.0, 20.0, -20.0 * (GLfloat) h / (GLfloat) w, 20.0 * (GLfloat) h / (GLfloat) w, -20.0, 20.0); else glOrtho(-20.0 * (GLfloat) w / (GLfloat) h, 20.0 * (GLfloat) w / (GLfloat) h, -20.0, 20.0, -20.0, 20.0); glMatrixMode(GL_MODELVIEW); } void main(int argc, char **argv) { glutInit(&argc, argv); /* need both double buffering and z buffer */ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutCreateWindow("stairs"); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutIdleFunc(NULL); glutMouseFunc(mouse); glEnable(GL_DEPTH_TEST); /* Enable hidden--surface--removal */ glClearColor(1.0, 1.0, 1.0, 1.0); glColor3f(0.0, 0.0, 0.0); glutMainLoop(); }