スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++、GLUT:複数ウィンドウの扱い

GLUTで複数ウィンドウを扱うプログラムを作成しました。
いやはや情報収集に苦労しました。
複数ウィンドウの作成は簡単ですが
ウィンドウを閉じるときに注意すべき点が多くありました。

glut_2window_test1.jpg

まずウィンドウを閉じる時、右上の×ボタンを押してはいけません。
mainloop自体が終了してプログラムも終了してしまいます。
ウィンドウを閉じるにはglutDestroyWindowを使います。
右クリックメニューで閉じるを選ぶようにしました。
さらに閉じたウィンドウに関する呼び出しを無効にしないと
Warningの嵐になります。(または落ちます。)
描画させるためにglutIdleFunc()内でglutPostRedisplay()を使いますが
閉じたウィンドウの描画を行わないようにする必要があります。

詳細は恥ずかしながら以下のサンプルを。

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <GL/glut.h>

//--------- 各種外部変数 --------------//
int WinID[2]; //ウィンドウID
int WindowNum = 0;
int WinFlag[2];
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();

//--- ウィンドウ1の設定---//
void display(void)
{
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(r),0,1,0);
DRAW_TRI();
glPopMatrix();

glutSwapBuffers();

if (++r > 360 ) r = 0;
}

void GLUT_CALL_FUNC()
{
glutDisplayFunc(display);
glutReshapeFunc(reshape);
//glutKeyboardFunc(keyboard);
}

void MY_INIT()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_DEPTH_TEST);
}

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);
}

//--- ウィンドウ2の設定---//
void GLUT_CALL_FUNC2()
{
glutDisplayFunc(display2);
glutReshapeFunc(reshape2);
}

void MY_INIT2()
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
}

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
it(int value)
{
printf("menu selection: win=%d, menu=%d\n", glutGetWindow(), glutGetMenu());
switch (value) {
case 1:
break;
case 2:
exit(0);
break;
case 999:
{
int ii=glutGetWindow();
WinFlag[ii-1]=0;
printf(" %d, %d\n", ii, WinFlag[ii]);
glutDestroyWindow(glutGetWindow());
//glutSetWindow(WinID[0]);
break;
}
default:
printf("value = %d\n", value);
}
}

// Idle
void idle(void)
{
for(int loop = 0; loop < WindowNum; ++loop){
if(WinFlag[loop]>0)
{
//printf("idle, loop=%d, WinFlag=%d\n", loop, WinFlag[loop]);
glutSetWindow(WinID[loop]);
glutPostRedisplay(); //再描画 (※display()関数を呼び出す関数 )
}
}
}

int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

// Window1 //
WinID[WindowNum] = glutCreateWindow(WindowName[WindowNum]);
printf("%d,%d\n",WinID[WindowNum],glutGetWindow());
WinFlag[WindowNum]=1;
WindowNum=WindowNum+1;
MY_INIT();
GLUT_CALL_FUNC();

glutCreateMenu(it);
glutAddMenuEntry("close window", 999);
glutAttachMenu(GLUT_RIGHT_BUTTON);

// Window2 //
WinID[WindowNum] = glutCreateWindow(WindowName[WindowNum]);
printf("%d,%d\n",WinID[WindowNum],glutGetWindow());
WinFlag[WindowNum]=1;
WindowNum=WindowNum+1;

MY_INIT2();
GLUT_CALL_FUNC2();

glutCreateMenu(it);
glutAddMenuEntry("close window", 999);
glutAttachMenu(GLUT_RIGHT_BUTTON);

glutIdleFunc(idle);

glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}

//---------- ここから各種関数 ------------//
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();
}

スポンサーサイト

コメントの投稿

非公開コメント

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
プロフィール

uglab

Author:uglab
ソフト開発会社

【Twitter】
フォローお願いします

【You tube動画一覧】
チャンネル登録お願いします


最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
スポンサードリンク
    【スポンサードリンク】

リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。