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
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
00147
00148
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
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 }