スポンサーリンク
glfwでは複数のウィンドウを作れる。以下はそのサンプルコード。
ただし別に別スレッドで動いているというものでもない。メッセージループは一つ。
イベント処理時は、コールバック関数がウィンドウへのポインタを第一引数に渡すので、それを比較して呼び出し元を区別できるが、違う関数を呼び出しても問題ない(はずだ)し普通はそうすべきだと思う。
#include <cstdio> #include <Windows.h> #include <gl/GL.h> #include <GLFW/glfw3.h> #pragma comment(lib,"opengl32.lib") #pragma comment(lib,"glfw3.lib") // ウィンドウを格納する変数 GLFWwindow* window1; GLFWwindow* window2;//キー入力を処理するコールバック関数 void key_callback(GLFWwindow* pwin, int key, int scancode, int action, int mods) { if ( action != GLFW_PRESS) return; //ウィンドウの判別をポインタで行う if (window1 == pwin) { printf("window 1 "); } if (window2 == pwin) { printf("window 2 "); } //キーイベント if ( key == GLFW_KEY_UP) { printf("key up\n"); } else if ( key == GLFW_KEY_DOWN ) { printf("key down\n"); } else if ( key == GLFW_KEY_LEFT ) { printf("key left\n"); } else if ( key == GLFW_KEY_RIGHT ) { printf("key right\n"); } else { printf("\n"); } } // マウスクリックを処理するコールバック関数 void mouse_button_callback(GLFWwindow* pwin, int button, int action, int mods) { if (action != GLFW_PRESS) { return; } //ウィンドウの判別をポインタで行う if (window1 == pwin) { printf("window 1 "); } if (window2 == pwin) { printf("window 2 "); } //マウスイベント if (button == GLFW_MOUSE_BUTTON_LEFT) { printf("L - down\n"); } else if (button == GLFW_MOUSE_BUTTON_RIGHT) { printf("R - down\n"); } else if (button == GLFW_MOUSE_BUTTON_MIDDLE) { printf("M - down\n"); } else { printf("\n"); } }void render1(int width,int height);//window 1 用描画関数 void render2(int width, int height);//window 2 用描画関数int main() { if (glfwInit() == GL_FALSE) { return 1; } window1 = glfwCreateWindow(400,400,"window 1",NULL,NULL); window2 = glfwCreateWindow(400,400,"window 2",NULL,NULL); if (window1 == nullptr) { glfwTerminate(); return 1; } if (window2 == nullptr) { glfwTerminate(); return 1; } //////////////////////////////////////////// // コールバック関数の設定 glfwSetKeyCallback(window1, key_callback); glfwSetKeyCallback(window2, key_callback); glfwSetMouseButtonCallback(window1, mouse_button_callback); glfwSetMouseButtonCallback(window2, mouse_button_callback); // //////////////////////////////////////////// while (glfwWindowShouldClose(window1) == GL_FALSE) { int width, height; //////////////////////////////////////////////////////// glfwGetFramebufferSize(window1, &width, &height); glfwMakeContextCurrent(window1); render1(width,height); glfwSwapBuffers(window1); //////////////////////////////////////////////////////// glfwGetFramebufferSize(window2, &width, &height); glfwMakeContextCurrent(window2); render2(width, height); glfwSwapBuffers(window2); //////////////////////////////////////////////////////// // イベント取得 glfwWaitEvents(); } glfwTerminate(); }void render1(int width, int height) { glViewport(0, 0, width, height); glOrtho(-1, 1, -1, 1, -1, 1); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1, 0, 0); glVertex2d(-0.7, -0.7); glColor3d(0, 1, 0); glVertex2d(-0.7, 0.7); glColor3d(0, 0, 1); glVertex2d(0.7, 0.7); glColor3d(1, 1, 1); glVertex2d(0.7, -0.7); glEnd(); } void render2(int width, int height) { glViewport(0, 0, width, height); glOrtho(-1, 1, -1, 1, -1, 1); glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(0, 1, 1); glVertex2d(-0.7, -0.7); glColor3d(1, 0, 1); glVertex2d(-0.7, 0.7); glColor3d(1, 1, 0); glVertex2d(0.7, 0.7); glColor3d(0, 0, 0); glVertex2d(0.7, -0.7); glEnd(); }