void MyCanvas::OnSize(wxSizeEvent& event) { //printf("OnSize\n"); if (!IsShownOnScreen()) return; SetCurrent(*m_glRC); resize_callback(event.GetSize().x, event.GetSize().y); }
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { LRESULT result = NULL; Window* window = Window::GetWindowClass(hWnd); if (window == nullptr) return DefWindowProc(hWnd, message, wParam, lParam); switch (message) { case WM_ACTIVATE: { if (!HIWORD(wParam)) // Is minimized { // active } else { // inactive } return 0; } case WM_SYSCOMMAND: { switch (wParam) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; } result = DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_CLOSE: case WM_DESTROY: PostQuitMessage(0); break; case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP: key_callback(window, wParam, message); break; case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: mouse_button_callback(window, message, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); break; case WM_SIZE: resize_callback(window, LOWORD(lParam), HIWORD(lParam)); break; default: result = DefWindowProc(hWnd, message, wParam, lParam); } return result; }
void Viewer::init() { // initialize glfw glfwSetErrorCallback( err_callback ); if( !glfwInit() ) { out_err("Error: could not initialize GLFW!"); exit( 1 ); } // create window string title = renderer ? "CMU462: " + renderer->name() : "CMU462"; window = glfwCreateWindow( DEFAULT_W, DEFAULT_H, title.c_str(), NULL, NULL ); if (!window) { out_err("Error: could not create window!"); glfwTerminate(); exit( 1 ); } // set context glfwMakeContextCurrent( window ); glfwSwapInterval(1); // framebuffer event callbacks glfwSetFramebufferSizeCallback( window, resize_callback ); // key event callbacks glfwSetKeyCallback( window, key_callback ); // cursor event callbacks glfwSetCursorPosCallback( window, cursor_callback ); // wheel event callbacks glfwSetScrollCallback(window, scroll_callback); // mouse button callbacks glfwSetInputMode(window, GLFW_STICKY_MOUSE_BUTTONS, 1); glfwSetMouseButtonCallback(window, mouse_button_callback); // initialize glew if (glewInit() != GLEW_OK) { out_err("Error: could not initialize GLEW!"); glfwTerminate(); exit( 1 ); } // enable alpha blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // resize components to current window size, get DPI glfwGetFramebufferSize(window, (int*) &buffer_w, (int*) &buffer_h ); if( buffer_w > DEFAULT_W ) HDPI = true; // initialize renderer if already set if (renderer){ if (HDPI) renderer->use_hdpi_reneder_target(); renderer->init(); } // initialize status OSD osd_text = new OSDText(); if (osd_text->init(HDPI) < 0) { out_err("Error: could not initialize on-screen display!"); exit( 1 ); } // add lines for renderer and fps line_id_renderer = osd_text->add_line(-0.95, 0.90, "Renderer", 18, Color(0.15, 0.5, 0.15)); line_id_framerate = osd_text->add_line(-0.98, -0.96, "Framerate", 14, Color(0.15, 0.5, 0.15)); // resize elements to current size resize_callback(window, buffer_w, buffer_h); }
int main(int argc, char** argv) { int ch, width, height; thrd_t physics_thread = 0; GLFWwindow* window; GLFWmonitor* monitor = NULL; if (!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); exit(EXIT_FAILURE); } while ((ch = getopt(argc, argv, "fh")) != -1) { switch (ch) { case 'f': monitor = glfwGetPrimaryMonitor(); break; case 'h': usage(); exit(EXIT_SUCCESS); } } if (monitor) { const GLFWvidmode* mode = glfwGetVideoMode(monitor); glfwWindowHint(GLFW_RED_BITS, mode->redBits); glfwWindowHint(GLFW_GREEN_BITS, mode->greenBits); glfwWindowHint(GLFW_BLUE_BITS, mode->blueBits); glfwWindowHint(GLFW_REFRESH_RATE, mode->refreshRate); width = mode->width; height = mode->height; } else { width = 640; height = 480; } window = glfwCreateWindow(width, height, "Particle Engine", monitor, NULL); if (!window) { fprintf(stderr, "Failed to create GLFW window\n"); glfwTerminate(); exit(EXIT_FAILURE); } if (monitor) glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glfwMakeContextCurrent(window); glfwSwapInterval(1); glfwSetWindowSizeCallback(window, resize_callback); glfwSetKeyCallback(window, key_callback); // Set initial aspect ratio glfwGetWindowSize(window, &width, &height); resize_callback(window, width, height); // Upload particle texture glGenTextures(1, &particle_tex_id); glBindTexture(GL_TEXTURE_2D, particle_tex_id); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, P_TEX_WIDTH, P_TEX_HEIGHT, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, particle_texture); // Upload floor texture glGenTextures(1, &floor_tex_id); glBindTexture(GL_TEXTURE_2D, floor_tex_id); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, F_TEX_WIDTH, F_TEX_HEIGHT, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, floor_texture); if (glfwExtensionSupported("GL_EXT_separate_specular_color")) { glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL_EXT, GL_SEPARATE_SPECULAR_COLOR_EXT); } // Set filled polygon mode as default (not wireframe) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); wireframe = 0; // Set initial times thread_sync.t = 0.0; thread_sync.dt = 0.001f; thread_sync.p_frame = 0; thread_sync.d_frame = 0; mtx_init(&thread_sync.particles_lock, mtx_timed); cnd_init(&thread_sync.p_done); cnd_init(&thread_sync.d_done); if (thrd_create(&physics_thread, physics_thread_main, window) != thrd_success) { glfwTerminate(); exit(EXIT_FAILURE); } glfwSetTime(0.0); while (!glfwWindowShouldClose(window)) { draw_scene(window, glfwGetTime()); glfwSwapBuffers(window); glfwPollEvents(); } thrd_join(physics_thread, NULL); glfwDestroyWindow(window); glfwTerminate(); exit(EXIT_SUCCESS); }