// uiloop void ui_loop(const ym_string& filename, const ym_string& imfilename, yo_scene* scene, ysr_scene* rigid_scene, float dt, int w, int h, bool camera_lights, float amb, bool no_ui) { // view data view_params* view = init_view_params( filename, imfilename, scene, rigid_scene, dt, w, h, camera_lights, amb); // glfw if (!glfwInit()) exit(EXIT_FAILURE); GLFWwindow* window = glfwCreateWindow(view->w, view->h, "yshade", 0, 0); glfwMakeContextCurrent(window); glfwSetWindowUserPointer(window, view); // callbacks glfwSetCharCallback(window, text_callback); glfwSetWindowSizeCallback(window, window_size_callback); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetMouseButtonCallback(window, mouse_button_callback); glfwSetCursorPosCallback(window, mouse_pos_callback); glfwSetWindowRefreshCallback(window, window_refresh_callback); // init gl extensions #ifndef __APPLE__ if (glewInit() != GLEW_OK) exit(EXIT_FAILURE); #endif // init shade state view->shade_prog = yg_stdshader_make_program(); view->shade_txt.resize(scene->textures.size()); for (int i = 0; i < scene->textures.size(); i++) { yo_texture* txt = &scene->textures[i]; view->shade_txt[i] = yg_make_texture(txt->pixels.data(), txt->width, txt->height, txt->ncomp, false, true); } // ui loop while (!glfwWindowShouldClose(window)) { window_refresh_callback(window); if (view->simulating) { simulate_step(view); glfwPollEvents(); } else { glfwWaitEvents(); } } glfwDestroyWindow(window); glfwTerminate(); delete view; }
// uiloop void ui_loop(int nimgs, view_img* imgs) { // view params view_params* view = init_view_params(nimgs, imgs); // window if (!glfwInit()) exit(EXIT_FAILURE); GLFWwindow* window = glfwCreateWindow(view->w, view->h, "imview", 0, 0); glfwMakeContextCurrent(window); glfwSetWindowUserPointer(window, view); // callbacks glfwSetCharCallback(window, text_callback); glfwSetWindowSizeCallback(window, window_size_callback); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetMouseButtonCallback(window, mouse_button_callback); glfwSetCursorPosCallback(window, mouse_pos_callback); glfwSetWindowRefreshCallback(window, window_refresh_callback); // init gl extensions #ifdef YG_USING_GLEW if (glewInit() != GLEW_OK) exit(EXIT_FAILURE); #endif // load textures for (int i = 0; i < nimgs; i++) { imgs[i].tex_glid = yg_make_texture(imgs[i].pixels, imgs[i].w, imgs[i].h, imgs[i].nc, true, false); } // ui loop while (!glfwWindowShouldClose(window)) { window_refresh_callback(window); glfwWaitEvents(); } glfwDestroyWindow(window); glfwTerminate(); free(view); }
int main(int argc, char** argv) { int ch, i, window_count; int auto_iconify = GLFW_TRUE, fullscreen = GLFW_FALSE, all_monitors = GLFW_FALSE; GLFWwindow** windows; while ((ch = getopt(argc, argv, "afhn")) != -1) { switch (ch) { case 'a': all_monitors = GLFW_TRUE; break; case 'h': usage(); exit(EXIT_SUCCESS); case 'f': fullscreen = GLFW_TRUE; break; case 'n': auto_iconify = GLFW_FALSE; break; default: usage(); exit(EXIT_FAILURE); } } glfwSetErrorCallback(error_callback); if (!glfwInit()) exit(EXIT_FAILURE); glfwWindowHint(GLFW_AUTO_ICONIFY, auto_iconify); if (fullscreen && all_monitors) { int monitor_count; GLFWmonitor** monitors = glfwGetMonitors(&monitor_count); window_count = monitor_count; windows = calloc(window_count, sizeof(GLFWwindow*)); for (i = 0; i < monitor_count; i++) { windows[i] = create_window(monitors[i]); if (!windows[i]) break; } } else { GLFWmonitor* monitor = NULL; if (fullscreen) monitor = glfwGetPrimaryMonitor(); window_count = 1; windows = calloc(window_count, sizeof(GLFWwindow*)); windows[0] = create_window(monitor); } for (i = 0; i < window_count; i++) { glfwSetKeyCallback(windows[i], key_callback); glfwSetFramebufferSizeCallback(windows[i], framebuffer_size_callback); glfwSetWindowSizeCallback(windows[i], window_size_callback); glfwSetWindowFocusCallback(windows[i], window_focus_callback); glfwSetWindowIconifyCallback(windows[i], window_iconify_callback); glfwSetWindowRefreshCallback(windows[i], window_refresh_callback); window_refresh_callback(windows[i]); printf("Window is %s and %s\n", glfwGetWindowAttrib(windows[i], GLFW_ICONIFIED) ? "iconified" : "restored", glfwGetWindowAttrib(windows[i], GLFW_FOCUSED) ? "focused" : "defocused"); } for (;;) { glfwWaitEvents(); for (i = 0; i < window_count; i++) { if (glfwWindowShouldClose(windows[i])) break; } if (i < window_count) break; // Workaround for an issue with msvcrt and mintty fflush(stdout); } glfwTerminate(); exit(EXIT_SUCCESS); }