#include #include #include GLfloat light0_ambient[] = {0.2, 0.2, 0.2, 1.0}; GLfloat light0_diffuse[] = {0.0, 0.0, 0.0, 1.0}; GLfloat light1_diffuse[] = {1.0, 0.0, 0.0, 1.0}; GLfloat light1_position[] = {1.0, 1.0, 1.0, 0.0}; GLfloat light2_diffuse[] = {0.0, 1.0, 0.0, 1.0}; GLfloat light2_position[] = {-1.0, -1.0, 1.0, 0.0}; float s = 0.0; GLfloat angle1 = 0.0, angle2 = 0.0; void output(GLfloat x, GLfloat y, char *text) { char *p; glPushMatrix(); glTranslatef(x, y, 0); for (p = text; *p; p++) glutStrokeCharacter(GLUT_STROKE_ROMAN, *p); glPopMatrix(); } void display(void) { static GLfloat amb[] = {0.4, 0.4, 0.4, 0.0}; static GLfloat dif[] = {1.0, 1.0, 1.0, 0.0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_LIGHT1); glDisable(GL_LIGHT2); amb[3] = dif[3] = cos(s) / 2.0 + 0.5; glMaterialfv(GL_FRONT, GL_AMBIENT, amb); glMaterialfv(GL_FRONT, GL_DIFFUSE, dif); glPushMatrix(); glTranslatef(-0.3, -0.3, 0.0); glRotatef(angle1, 1.0, 5.0, 0.0); glCallList(1); /* render ico display list */ glPopMatrix(); glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_LIGHT2); glDisable(GL_LIGHT1); amb[3] = dif[3] = 0.5 - cos(s * .95) / 2.0; glMaterialfv(GL_FRONT, GL_AMBIENT, amb); glMaterialfv(GL_FRONT, GL_DIFFUSE, dif); glPushMatrix(); glTranslatef(0.3, 0.3, 0.0); glRotatef(angle2, 1.0, 0.0, 5.0); glCallList(1); /* render ico display list */ glPopMatrix(); glPushAttrib(GL_ENABLE_BIT); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, 1500, 0, 1500); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); /* Rotate text slightly to help show jaggies. */ glRotatef(4, 0.0, 0.0, 1.0); output(200, 225, "This is universe."); glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); output(160, 100, "spinning toruses"); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glPopAttrib(); glMatrixMode(GL_MODELVIEW); glutSwapBuffers(); } void idle(void) { angle1 = (GLfloat) fmod(angle1 + 0.8, 360.0); angle2 = (GLfloat) fmod(angle2 + 1.1, 360.0); s += 0.05; glutPostRedisplay(); } void visible(int vis) { if (vis == GLUT_VISIBLE) glutIdleFunc(idle); else glutIdleFunc(NULL); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow("universe"); glutDisplayFunc(display); glutVisibilityFunc(visible); glNewList(1, GL_COMPILE); /* create ico display list */ glutSolidTorus(0.75, 0.85, 3, 15); glEndList(); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); glLightfv(GL_LIGHT1, GL_POSITION, light1_position); glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse); glLightfv(GL_LIGHT2, GL_POSITION, light2_position); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LINE_SMOOTH); glLineWidth(2.0); glMatrixMode(GL_PROJECTION); gluPerspective( /* field of view in degree */ 40.0, /* aspect ratio */ 1.0, /* Z near */ 1.0, /* Z far */ 10.0); glMatrixMode(GL_MODELVIEW); gluLookAt(0.0, 0.0, 5.0, /* eye is at (0,0,5) */ 0.0, 0.0, 0.0, /* center is at (0,0,0) */ 0.0, 1.0, 0.); /* up is in positive Y direction */ glTranslatef(0.0, 0.6, -1.0); glutMainLoop(); return 0; /* ANSI C requires main to return int. */ }