最終更新: mikk_ni3_92 2008年12月13日(土) 18:18:08履歴
現在地: メニュー >> 発展編03 >> 発展編03::複数ウィンドウ >> 発展編03::まとめコード2
#include <GL/glut.h> //--------- 各種外部変数 --------------// const int WindowNum = 2; //ウィンドウの数 int WinID[WindowNum]; //ウィンドウID const char *WindowName[]={"Window 1", "Window 2"}; //-------- 各種プロトタイプ宣言 ----------// void display(); void reshape(int w, int h); void display2(); void reshape2(int w, int h); void idle(); void DRAW_XYZ(); void DRAW_TRI(); //------------ OpenGLの初期設定 ------------// void GLUT_INIT(int &ID,const char* name) { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE|GLUT_DEPTH); glutInitWindowSize(640,480); ID = glutCreateWindow(name); } void GLUT_INIT2(int &ID,const char* name) { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE|GLUT_DEPTH); glutInitWindowSize(320,240); ID = glutCreateWindow(name); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); } void GLUT_CALL_FUNC2() { glutDisplayFunc(display2); glutReshapeFunc(reshape2); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); glEnable(GL_DEPTH_TEST); } void MY_INIT2() { glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_DEPTH_TEST); } //関数ポインタの宣言 void (*GLUT_INIT_Ary[])(int &ID,const char* name) = {GLUT_INIT,GLUT_INIT2}; void (*GLUT_CALL_FUNC_Ary[])() = {GLUT_CALL_FUNC,GLUT_CALL_FUNC2}; void (*MY_INIT_Ary[])() = {MY_INIT,MY_INIT2}; //-------- ここからメイン関数 ------------// int main(int argc, char **argv) { glutInit(&argc,argv); for(int loop = 0; loop < WindowNum; ++loop) { ( *GLUT_INIT_Ary[loop])( WinID[loop],WindowName[loop]);//関数ポインタを呼ぶ ( *GLUT_CALL_FUNC_Ary[loop])(); ( *MY_INIT_Ary[loop])() ; } glutIdleFunc(idle); glutMainLoop(); return 0; } //--------- ここから各種コールバック -----------// void display() { static int r =0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); DRAW_XYZ(); glPushMatrix(); glRotatef(static_cast<float>(r),0,1,0); DRAW_TRI(); glPopMatrix(); glutSwapBuffers(); if (++r > 360 ) r = 0; } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); } void display2() { static int r =0; glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); DRAW_XYZ(); glPushMatrix(); glRotatef(static_cast<float>(r),0,-1,0); DRAW_TRI(); glPopMatrix(); glutSwapBuffers(); if (++r > 360 ) r = 0; } void reshape2(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); } void idle(void) { for(int loop = 0; loop < WindowNum; ++loop){ glutSetWindow(WinID[loop]); glutPostRedisplay(); //再描画 (※display()関数を呼び出す関数 ) } } //---------- ここから各種関数 ------------// void DRAW_XYZ() { glBegin(GL_LINES); glColor3d(0,1,0);//x glVertex2d(-100,0); glVertex2d(100, 0); glColor3d(1,0,0);//y glVertex2d(0,0); glVertex2d(0,100); glColor3d(0,0,1);//z glVertex3d(0,0,-100); glVertex3d(0,0, 100); glEnd(); } void DRAW_TRI() { glBegin(GL_TRIANGLES); glColor3d(1,1,0); glVertex2d(0,1); glVertex2d(-0.5, 0); glVertex2d(0.5, 0); glEnd(); }