refactoring app::display

pull/3471/head
kallaballa 2 years ago
parent 2ebfb0cb0d
commit 22dabd954d
  1. 72
      src/common/subsystems.hpp

@ -52,12 +52,28 @@ bool offscreen;
namespace display { namespace display {
GLFWwindow* window; GLFWwindow* window;
void terminate() { GLFWwindow* get_window() {
glfwDestroyWindow(display::window); return window;
}
void terminate(GLFWwindow *win = display::get_window()) {
glfwDestroyWindow(win);
glfwTerminate(); glfwTerminate();
} }
float get_pixel_ratio(GLFWwindow *win = display::window) { std::pair<int,int> frameBufferSize(GLFWwindow *win = display::get_window()) {
int fbW, fbH;
glfwGetFramebufferSize(win, &fbW, &fbH);
return {fbW, fbH};
}
std::pair<int,int> windowSize(GLFWwindow *win = display::get_window()) {
int w, h;
glfwGetWindowSize(win, &w, &h);
return {w, h};
}
float get_pixel_ratio(GLFWwindow *win = display::get_window()) {
#if defined(_WIN32) #if defined(_WIN32)
HWND hWnd = glfwGetWin32Window(win); HWND hWnd = glfwGetWin32Window(win);
HMONITOR monitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST); HMONITOR monitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
@ -79,28 +95,26 @@ float get_pixel_ratio(GLFWwindow *win = display::window) {
} }
return 1.f; return 1.f;
#else #else
int fbW, fbH; return (float)frameBufferSize(win).first / (float)windowSize(win).first;
int w, h;
glfwGetFramebufferSize(win, &fbW, &fbH);
glfwGetWindowSize(win, &w, &h);
return (float)fbW / (float)w;
#endif #endif
} }
void update_size(float pixelRatio = display::get_pixel_ratio()) { void update_size(GLFWwindow *win = display::get_window()) {
glfwSetWindowSize(display::window, app::window_width * pixelRatio, app::window_height * pixelRatio); float pixelRatio = display::get_pixel_ratio(win);
glfwSetWindowSize(win, app::window_width * pixelRatio, app::window_height * pixelRatio);
glViewport(0, 0, app::window_width * pixelRatio, app::window_height * pixelRatio); glViewport(0, 0, app::window_width * pixelRatio, app::window_height * pixelRatio);
} }
bool is_fullscreen() { bool is_fullscreen(GLFWwindow* win = display::get_window()) {
return glfwGetWindowMonitor(display::window) != nullptr; return glfwGetWindowMonitor(win) != nullptr;
} }
void set_fullscreen(bool f) {
void set_fullscreen(bool f, GLFWwindow* win = display::get_window()) {
auto monitor = glfwGetPrimaryMonitor(); auto monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor); const GLFWvidmode* mode = glfwGetVideoMode(monitor);
if(f) { if(f) {
glfwSetWindowMonitor(display::window, monitor, 0,0, mode->width, mode->height, mode->refreshRate); glfwSetWindowMonitor(win, monitor, 0,0, mode->width, mode->height, mode->refreshRate);
} else { } else {
glfwSetWindowMonitor(display::window, nullptr, 0,0,app::window_width, app::window_height,mode->refreshRate); glfwSetWindowMonitor(win, nullptr, 0,0,app::window_width, app::window_height,mode->refreshRate);
} }
display::update_size(); display::update_size();
} }
@ -335,43 +349,43 @@ template <typename T> nanogui::detail::FormWidget<T> * make_gui_variable(const s
return var; return var;
} }
void init(int w, int h) { void init(int w, int h, GLFWwindow* win = display::get_window()) {
screen = new nanogui::Screen(); screen = new nanogui::Screen();
screen->initialize(display::window, false); screen->initialize(win, false);
screen->set_size(nanogui::Vector2i(w, h)); screen->set_size(nanogui::Vector2i(w, h));
form = new FormHelper(screen); form = new FormHelper(screen);
glfwSetCursorPosCallback(display::window, glfwSetCursorPosCallback(win,
[](GLFWwindow *, double x, double y) { [](GLFWwindow *, double x, double y) {
gui::screen->cursor_pos_callback_event(x, y); gui::screen->cursor_pos_callback_event(x, y);
} }
); );
glfwSetMouseButtonCallback(display::window, glfwSetMouseButtonCallback(win,
[](GLFWwindow *, int button, int action, int modifiers) { [](GLFWwindow *, int button, int action, int modifiers) {
gui::screen->mouse_button_callback_event(button, action, modifiers); gui::screen->mouse_button_callback_event(button, action, modifiers);
} }
); );
glfwSetKeyCallback(display::window, glfwSetKeyCallback(win,
[](GLFWwindow *, int key, int scancode, int action, int mods) { [](GLFWwindow *, int key, int scancode, int action, int mods) {
gui::screen->key_callback_event(key, scancode, action, mods); gui::screen->key_callback_event(key, scancode, action, mods);
} }
); );
glfwSetCharCallback(display::window, glfwSetCharCallback(win,
[](GLFWwindow *, unsigned int codepoint) { [](GLFWwindow *, unsigned int codepoint) {
gui::screen->char_callback_event(codepoint); gui::screen->char_callback_event(codepoint);
} }
); );
glfwSetDropCallback(display::window, glfwSetDropCallback(win,
[](GLFWwindow *, int count, const char **filenames) { [](GLFWwindow *, int count, const char **filenames) {
gui::screen->drop_callback_event(count, filenames); gui::screen->drop_callback_event(count, filenames);
} }
); );
glfwSetScrollCallback(display::window, glfwSetScrollCallback(win,
[](GLFWwindow *, double x, double y) { [](GLFWwindow *, double x, double y) {
gui::screen->scroll_callback_event(x, y); gui::screen->scroll_callback_event(x, y);
} }
); );
glfwSetFramebufferSizeCallback(display::window, glfwSetFramebufferSizeCallback(win,
[](GLFWwindow *, int width, int height) { [](GLFWwindow *, int width, int height) {
gui::screen->resize_callback_event(width, height); gui::screen->resize_callback_event(width, height);
} }
@ -384,9 +398,10 @@ void set_visible(bool v) {
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
} }
void update_size(float pixelRatio = display::get_pixel_ratio()) { void update_size() {
float pixelRatio = display::get_pixel_ratio();
gui::screen->set_size(nanogui::Vector2i(app::window_width * pixelRatio, app::window_height * pixelRatio)); gui::screen->set_size(nanogui::Vector2i(app::window_width * pixelRatio, app::window_height * pixelRatio));
display::update_size(pixelRatio); display::update_size();
} }
} //namespace gui } //namespace gui
@ -465,8 +480,9 @@ bool display() {
gui::screen->draw_contents(); gui::screen->draw_contents();
gl::blit_frame_buffer_to_screen(); gl::blit_frame_buffer_to_screen();
gui::screen->draw_widgets(); gui::screen->draw_widgets();
glfwSwapBuffers(display::window); auto* win = display::get_window();
return !glfwWindowShouldClose(display::window); glfwSwapBuffers(win);
return !glfwWindowShouldClose(win);
} }
return true; return true;
} }

Loading…
Cancel
Save