refactoring app::display

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

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

Loading…
Cancel
Save