void draw(void) { static int frame = 0; GLenum err; GLdouble secs; static double degrees = 0; GLfloat sphereX, sphereY, sphereZ; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* one revolution every 10 seconds... */ if (animate) { secs = get_secs(); secs = secs - 10. * floor(secs / 10.); degrees = (secs / 10.) * (360.); } /* if (frame == 0) { */ if (0) { /* switch the viewport and draw the faces of the cube from the * point of view of the square... */ glViewport(w + 0 * faceW, 0, faceW, faceW); make_projection(LEFT, 0, 0, 0); draw_scene(degrees, -1 & ~TORUS_BIT); glReadPixels(w + 0 * faceW, 0, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[LEFT]); eliminate_alpha(faceW, faceW, faceMap[LEFT]); glViewport(w + 1 * faceW, 0, faceW, faceW); make_projection(RIGHT, 0, 0, 0); draw_scene(degrees, -1 & ~TORUS_BIT); glReadPixels(w + 1 * faceW, 0, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[RIGHT]); eliminate_alpha(faceW, faceW, faceMap[RIGHT]); glViewport(w + 2 * faceW, 0, faceW, faceW); make_projection(BOTTOM, 0, 0, 0); draw_scene(degrees, -1 & ~TORUS_BIT); glReadPixels(w + 2 * faceW, 0, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[BOTTOM]); eliminate_alpha(faceW, faceW, faceMap[BOTTOM]); glViewport(w + 0 * faceW, faceW, faceW, faceW); make_projection(TOP, 0, 0, 0); draw_scene(degrees, -1 & ~TORUS_BIT); glReadPixels(w + 0 * faceW, faceW, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[TOP]); eliminate_alpha(faceW, faceW, faceMap[TOP]); glViewport(w + 1 * faceW, faceW, faceW, faceW); make_projection(FRONT, 0, 0, 0); draw_scene(degrees, -1 & ~TORUS_BIT); glReadPixels(w + 1 * faceW, faceW, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[FRONT]); eliminate_alpha(faceW, faceW, faceMap[FRONT]); glViewport(w + 2 * faceW, faceW, faceW, faceW); make_projection(BACK, 0, 0, 0); draw_scene(degrees, -1 & ~TORUS_BIT); glReadPixels(w + 2 * faceW, faceW, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[BACK]); eliminate_alpha(faceW, faceW, faceMap[BACK]); /* create the sphere map for the cube... */ glViewport(w, 2 * faceW, sphereW, sphereW); render_spheremap(); glReadPixels(w, 2 * faceW, sphereW, sphereW, GL_RGBA, GL_UNSIGNED_BYTE, sphereMap[0]); } else { sphereX = sphereY = cos((degrees / 360.) * 2. * M_PI); sphereZ = -sin((degrees / 360.) * 2. * M_PI); glViewport(w + 0 * faceW, 0, faceW, faceW); make_projection(LEFT, sphereX, sphereY, sphereZ); draw_scene(degrees, 0 & ~SPHERE_BIT); glReadPixels(w + 0 * faceW, 0, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[LEFT]); eliminate_alpha(faceW, faceW, faceMap[LEFT]); glViewport(w + 1 * faceW, 0, faceW, faceW); make_projection(RIGHT, sphereX, sphereY, sphereZ); draw_scene(degrees, 0 & ~SPHERE_BIT); glReadPixels(w + 1 * faceW, 0, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[RIGHT]); eliminate_alpha(faceW, faceW, faceMap[RIGHT]); glViewport(w + 2 * faceW, 0, faceW, faceW); make_projection(BOTTOM, sphereX, sphereY, sphereZ); draw_scene(degrees, 0 & ~SPHERE_BIT); glReadPixels(w + 2 * faceW, 0, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[BOTTOM]); eliminate_alpha(faceW, faceW, faceMap[BOTTOM]); glViewport(w + 0 * faceW, faceW, faceW, faceW); make_projection(TOP, sphereX, sphereY, sphereZ); draw_scene(degrees, 0 & ~SPHERE_BIT); glReadPixels(w + 0 * faceW, faceW, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[TOP]); eliminate_alpha(faceW, faceW, faceMap[TOP]); glViewport(w + 1 * faceW, faceW, faceW, faceW); make_projection(FRONT, sphereX, sphereY, sphereZ); draw_scene(degrees, 0 & ~SPHERE_BIT); glReadPixels(w + 1 * faceW, faceW, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[FRONT]); eliminate_alpha(faceW, faceW, faceMap[FRONT]); glViewport(w + 2 * faceW, faceW, faceW, faceW); make_projection(BACK, sphereX, sphereY, sphereZ); draw_scene(degrees, 0 & ~SPHERE_BIT); glReadPixels(w + 2 * faceW, faceW, faceW, faceW, GL_RGBA, GL_UNSIGNED_BYTE, faceMap[BACK]); eliminate_alpha(faceW, faceW, faceMap[BACK]); /* create the sphere map for the cube... */ glViewport(w + sphereW, 2 * faceW, sphereW, sphereW); render_spheremap(); glReadPixels(w + sphereW, 2 * faceW, sphereW, sphereW, GL_RGBA, GL_UNSIGNED_BYTE, sphereMap[1]); } frame = (frame == 0); /* draw both spheremaps */ glViewport(w, 2 * faceW, 2 * sphereW, sphereW); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, 2 * sphereW, 0, sphereW, 0, 1); glRasterPos2i(0, 0); glDrawPixels(sphereW, sphereW, GL_RGBA, GL_UNSIGNED_BYTE, sphereMap[0]); glRasterPos2i(sphereW, 0); glDrawPixels(sphereW, sphereW, GL_RGBA, GL_UNSIGNED_BYTE, sphereMap[1]); /* draw the scene for the viewer's visual gratification... */ glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, 1, .01, 10); gluLookAt(0, 0, 0, 0, 0, -1, 0, 1, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.f, 0.f, -2.577f); draw_scene(degrees, 2); /* just draw green sphere */ glLoadIdentity(); err = glGetError(); if (err != GL_NO_ERROR) printf("Error: %s\n", gluErrorString(err)); if (dblbuf) glutSwapBuffers(); else glFlush(); }
void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); switch (style) { case 0: make_view(4); make_projection(4); glViewport(width / 2, 0, width / 2, height / 2); draw_scene(); make_view(1); make_projection(1); glViewport(0, height / 2, width / 2, height / 2); draw_scene(); make_view(1); draw_view(); make_view(2); glViewport(width / 2, height / 2, width / 2, height / 2); draw_scene(); make_view(2); draw_view(); make_view(3); glViewport(0, 0, width / 2, height / 2); draw_scene(); make_view(3); draw_view(); break; case 1: make_view(1); make_projection(1); glViewport(0, 0, width, height); draw_scene(); make_view(1); draw_view(); break; case 2: make_view(2); glViewport(0, 0, width, height); draw_scene(); make_view(2); draw_view(); break; case 3: make_view(3); glViewport(0, 0, width, height); draw_scene(); make_view(3); draw_view(); break; case 4: glViewport(0, 0, width, height); make_view(4); make_projection(4); draw_scene(); break; } /*-------Swap the back buffer to the front --------*/ glutSwapBuffers(); return; }