Main Page | File List

gl.cpp

00001 #include <GL/glut.h>
00002 #include <cstdlib>
00003 #include "Canvas.h"
00004 
00005 
00006 int main_window;
00007 int win_w, win_h;
00008 
00009 GLuint texNames[10];
00010 Canvas tex[10];
00011 float rot_x = 0;
00012 
00013 
00014 void init_texture()
00015 {
00016   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00017 
00018   glGenTextures(1, texNames);
00019   glBindTexture(GL_TEXTURE_2D, texNames[0]);
00020 
00021   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
00022   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
00023   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
00024   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
00025 
00026   tex[0].ReadPPM("earth3.ppm");
00027   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 
00028                tex[0].hReso, tex[0].vReso, 
00029                0, GL_RGB, GL_FLOAT, tex[0].rgbs);
00030 
00031   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
00032   glEnable(GL_TEXTURE_2D);
00033 }
00034 
00035 void init(void)
00036 {    
00037    glClearColor (0.0, 0.0, 0.0, 0.0);
00038    glShadeModel(GL_SMOOTH);
00039    glEnable(GL_DEPTH_TEST);
00040 
00041    init_texture();
00042 }
00043 
00044 
00045 void display(void)
00046 {
00047   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00048   
00049   {
00050     int viewport_w = win_w / 2, viewport_h = win_h / 2;
00051     int viewport_sx = 0, viewport_sy = 0;
00052     
00053     glViewport(viewport_sx, viewport_sy , viewport_w, viewport_h);
00054 
00055     glMatrixMode(GL_PROJECTION);
00056     glLoadIdentity();
00057     gluPerspective(90, float(viewport_w) / viewport_h, .5, 30.0);
00058 
00059     glMatrixMode(GL_MODELVIEW);
00060     glLoadIdentity();
00061 
00062     glEnable(GL_TEXTURE_2D);
00063     //    glColor3f(1,1,1);
00064     glTranslatef(0, 0, -2);
00065     glRotatef(rot_x, 1, 0, 0);
00066     
00067     glBegin(GL_TRIANGLES);
00068     {    
00069       glTexCoord2f(0, 0); 
00070       glVertex3f( -2,  0, 0 );
00071       glTexCoord2f(1, 0); 
00072       glVertex3f(  2,  0, 0 );
00073       glTexCoord2f(0.5, 1); 
00074       glVertex3f(  0,  2, 0 );
00075     }
00076     glEnd();
00077   }
00078 
00079   {
00080     int viewport_w = win_w / 2, viewport_h = win_h / 2;
00081     int viewport_sx = win_w / 2, viewport_sy = 0;
00082     
00083     glViewport(viewport_sx, viewport_sy , viewport_w, viewport_h);
00084 
00085     glMatrixMode(GL_PROJECTION);
00086     glLoadIdentity();
00087     gluPerspective(90, float(viewport_w) / viewport_h, .5, 30.0);
00088 
00089     glMatrixMode(GL_MODELVIEW);
00090     glLoadIdentity();
00091 
00092     glEnable(GL_TEXTURE_2D);
00093     glColor3f(1,1,1);
00094     glBegin(GL_TRIANGLES);
00095     {    
00096       glTexCoord2f(0, 0); 
00097       glVertex3f( -2,  0, -2 );
00098       glTexCoord2f(1, 0); 
00099       glVertex3f(  2,  0, -2 );
00100       glTexCoord2f(0.5, 1); 
00101       glVertex3f(  0,  2, -2 );
00102     }
00103     glEnd();
00104   }
00105   glDisable(GL_TEXTURE_2D);
00106   glColor3f(1,0,0);
00107   
00108   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00109   glBegin(GL_QUADS);
00110   {    
00111     glVertex3f( -2.2,  0, -2.2 );
00112     glVertex3f(  2.2,  0, -2.2 );
00113     glVertex3f(  2.2,  2.2, -2.2 );
00114     glVertex3f(  -2.2, 2.2, -2.2 );
00115   }
00116   glEnd();
00117 
00118   glRasterPos3f(-1, 0, -1);
00119   glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, 'B');
00120 
00121   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00122 
00123 
00124   glutSwapBuffers();
00125 
00126   static Canvas c;
00127   c.ReadGLbuffer(0, 0,  win_w, win_h);
00128   c.WritePPM("t.ppm");
00129 }
00130 
00131 
00132 void reshape(int w, int h)
00133 {
00134   win_w = w;  win_h = h;
00135 
00136   glViewport(0, 0, (GLsizei) win_w, (GLsizei) win_h);
00137 
00138   glMatrixMode(GL_PROJECTION);
00139   glLoadIdentity();
00140   gluPerspective(90, (GLfloat) win_w/(GLfloat) win_h, .5, 30.0);
00141 }
00142 
00143 
00144 void myGlutIdle( void )
00145 {
00146   /* According to the GLUT specification, the current window is 
00147      undefined during an idle callback.  So we need to explicitly change
00148      it if necessary */
00149   if ( glutGetWindow() != main_window ) 
00150     glutSetWindow(main_window);  
00151 
00152   rot_x += 1;
00153   
00154   glutPostRedisplay();
00155 }
00156 
00157 void keyboard(unsigned char key, int x, int y)
00158 {
00159   if(key == 'q' || key == 'Q')
00160     exit(0);
00161 }
00162 
00163 
00164 
00165 void mouse(int button, int state, int x, int y) 
00166 {
00167 
00168   if (button == GLUT_LEFT_BUTTON) {
00169     if (state == GLUT_DOWN) {
00170       // do something...
00171     }
00172   }
00173   
00174 }
00175  
00176 
00177 int main(int argc, char** argv)
00178 {
00179    glutInit(&argc, argv);
00180    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
00181    glutInitWindowSize(512, 512);
00182    glutInitWindowPosition(100, 100);
00183    main_window = glutCreateWindow(argv[0]);
00184 
00185    init();
00186 
00187    glutDisplayFunc(display);
00188    glutReshapeFunc(reshape);
00189    glutIdleFunc( myGlutIdle );
00190 
00191    glutMouseFunc(mouse);
00192 
00193    glutKeyboardFunc(keyboard);
00194 
00195    glutMainLoop();
00196    return 0; 
00197 }

Generated on Wed Aug 11 17:53:31 2004 by doxygen 1.3.6