From 7262119f5b56d61b6fd752b2980d6687d65477f7 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 21 Mar 2025 04:18:14 +0300 Subject: [PATCH] refactor GLFWWindow --- src/engine/Engine.cpp | 10 ++- src/engine/Mainloop.cpp | 2 +- src/frontend/hud.cpp | 2 +- src/frontend/screens/LevelScreen.cpp | 2 +- src/frontend/screens/MenuScreen.cpp | 2 +- src/graphics/core/DrawContext.cpp | 2 +- src/graphics/render/BlocksPreview.cpp | 2 +- src/graphics/render/Skybox.cpp | 2 +- src/graphics/render/WorldRenderer.cpp | 2 +- src/graphics/ui/GUI.cpp | 2 +- src/graphics/ui/elements/TextBox.cpp | 2 +- src/logic/PlayerController.cpp | 2 +- src/window/{display.hpp => Window.hpp} | 10 +-- src/window/detail/GLFWWindow.cpp | 110 +++++++++++++++++-------- 14 files changed, 99 insertions(+), 53 deletions(-) rename src/window/{display.hpp => Window.hpp} (93%) diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index a9d586d8..b6db2d21 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -35,7 +35,7 @@ #include "util/platform.hpp" #include "window/Camera.hpp" #include "window/input.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "world/Level.hpp" #include "Mainloop.hpp" #include "ServerMainloop.hpp" @@ -95,7 +95,13 @@ void Engine::initialize(CoreParameters coreParameters) { controller = std::make_unique(*this); if (!params.headless) { - auto [window, input] = display::initialize(&settings.display); + std::string title = "VoxelCore v" + + std::to_string(ENGINE_VERSION_MAJOR) + "." + + std::to_string(ENGINE_VERSION_MINOR); + if (ENGINE_DEBUG_BUILD) { + title += " [debug]"; + } + auto [window, input] = Window::initialize(&settings.display, title); if (!window || !input){ throw initialize_error("could not initialize window"); } diff --git a/src/engine/Mainloop.cpp b/src/engine/Mainloop.cpp index 7f734d16..ecfd17bc 100644 --- a/src/engine/Mainloop.cpp +++ b/src/engine/Mainloop.cpp @@ -4,7 +4,7 @@ #include "debug/Logger.hpp" #include "frontend/screens/MenuScreen.hpp" #include "frontend/screens/LevelScreen.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "world/Level.hpp" static debug::Logger logger("mainloop"); diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 56f365a5..f330b508 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -41,7 +41,7 @@ #include "voxels/GlobalChunks.hpp" #include "window/Camera.hpp" #include "window/input.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "world/Level.hpp" #include "world/World.hpp" #include "debug/Logger.hpp" diff --git a/src/frontend/screens/LevelScreen.cpp b/src/frontend/screens/LevelScreen.cpp index 17f89734..c10f40c5 100644 --- a/src/frontend/screens/LevelScreen.cpp +++ b/src/frontend/screens/LevelScreen.cpp @@ -30,7 +30,7 @@ #include "util/stringutil.hpp" #include "voxels/Chunks.hpp" #include "window/Camera.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "world/Level.hpp" #include "world/World.hpp" diff --git a/src/frontend/screens/MenuScreen.cpp b/src/frontend/screens/MenuScreen.cpp index 6af53d35..62699488 100644 --- a/src/frontend/screens/MenuScreen.cpp +++ b/src/frontend/screens/MenuScreen.cpp @@ -7,7 +7,7 @@ #include "graphics/core/Texture.hpp" #include "assets/Assets.hpp" #include "maths/UVRegion.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "window/Camera.hpp" #include "engine/Engine.hpp" diff --git a/src/graphics/core/DrawContext.cpp b/src/graphics/core/DrawContext.cpp index b9525a32..ef98b24d 100644 --- a/src/graphics/core/DrawContext.cpp +++ b/src/graphics/core/DrawContext.cpp @@ -6,7 +6,7 @@ #include "Batch2D.hpp" #include "Framebuffer.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" static void set_blend_mode(BlendMode mode) { switch (mode) { diff --git a/src/graphics/render/BlocksPreview.cpp b/src/graphics/render/BlocksPreview.cpp index 34632ed7..2be2e368 100644 --- a/src/graphics/render/BlocksPreview.cpp +++ b/src/graphics/render/BlocksPreview.cpp @@ -6,7 +6,7 @@ #include "frontend/ContentGfxCache.hpp" #include "voxels/Block.hpp" #include "window/Camera.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "graphics/core/Atlas.hpp" #include "graphics/core/Batch3D.hpp" #include "graphics/core/Framebuffer.hpp" diff --git a/src/graphics/render/Skybox.cpp b/src/graphics/render/Skybox.cpp index 0b987e2d..af3a1587 100644 --- a/src/graphics/render/Skybox.cpp +++ b/src/graphics/render/Skybox.cpp @@ -7,7 +7,7 @@ #include "graphics/core/Cubemap.hpp" #include "graphics/core/Framebuffer.hpp" #include "graphics/core/DrawContext.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "window/Camera.hpp" #include "maths/UVRegion.hpp" diff --git a/src/graphics/render/WorldRenderer.cpp b/src/graphics/render/WorldRenderer.cpp index 621030c6..61c3a472 100644 --- a/src/graphics/render/WorldRenderer.cpp +++ b/src/graphics/render/WorldRenderer.cpp @@ -28,7 +28,7 @@ #include "voxels/Chunk.hpp" #include "voxels/Chunks.hpp" #include "window/Camera.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "world/Level.hpp" #include "world/LevelEvents.hpp" #include "world/World.hpp" diff --git a/src/graphics/ui/GUI.cpp b/src/graphics/ui/GUI.cpp index b436470a..3fdba305 100644 --- a/src/graphics/ui/GUI.cpp +++ b/src/graphics/ui/GUI.cpp @@ -20,7 +20,7 @@ #include "graphics/core/Shader.hpp" #include "gui_util.hpp" #include "window/Camera.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "window/input.hpp" #include diff --git a/src/graphics/ui/elements/TextBox.cpp b/src/graphics/ui/elements/TextBox.cpp index 567d1446..99d2937e 100644 --- a/src/graphics/ui/elements/TextBox.cpp +++ b/src/graphics/ui/elements/TextBox.cpp @@ -15,7 +15,7 @@ #include "graphics/core/Font.hpp" #include "graphics/ui/markdown.hpp" #include "util/stringutil.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "devtools/actions.hpp" #include "../markdown.hpp" diff --git a/src/logic/PlayerController.cpp b/src/logic/PlayerController.cpp index 12ceae0d..b157e5e5 100644 --- a/src/logic/PlayerController.cpp +++ b/src/logic/PlayerController.cpp @@ -23,7 +23,7 @@ #include "voxels/Chunks.hpp" #include "voxels/voxel.hpp" #include "window/Camera.hpp" -#include "window/display.hpp" +#include "window/Window.hpp" #include "window/input.hpp" #include "world/Level.hpp" diff --git a/src/window/display.hpp b/src/window/Window.hpp similarity index 93% rename from src/window/display.hpp rename to src/window/Window.hpp index a422764b..8800be8c 100644 --- a/src/window/display.hpp +++ b/src/window/Window.hpp @@ -44,16 +44,16 @@ public: const glm::ivec2& getSize() const { return size; } + + static std::tuple< + std::unique_ptr, + std::unique_ptr + > initialize(DisplaySettings* settings, std::string title); protected: glm::ivec2 size; }; namespace display { - std::tuple< - std::unique_ptr, - std::unique_ptr - > initialize(DisplaySettings* settings); - void clear(); void clearDepth(); void setBgColor(glm::vec3 color); diff --git a/src/window/detail/GLFWWindow.cpp b/src/window/detail/GLFWWindow.cpp index a8a80638..180707b3 100644 --- a/src/window/detail/GLFWWindow.cpp +++ b/src/window/detail/GLFWWindow.cpp @@ -1,4 +1,4 @@ -#include "window/display.hpp" +#include "window/Window.hpp" #include #include @@ -85,6 +85,45 @@ static void GLAPIENTRY gl_message_callback( << gl_severity_name(severity) << ": " << message; } +static bool initialize_gl(int width, int height) { + glewExperimental = GL_TRUE; + + GLenum glewErr = glewInit(); + if (glewErr != GLEW_OK) { + if (glewErr == GLEW_ERROR_NO_GLX_DISPLAY) { + // see issue #240 + logger.warning() + << "glewInit() returned GLEW_ERROR_NO_GLX_DISPLAY; ignored"; + } else { + logger.error() << "failed to initialize GLEW:\n" + << glewGetErrorString(glewErr); + return true; + } + } + + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(gl_message_callback, 0); + + glViewport(0, 0, width, height); + glClearColor(0.0f, 0.0f, 0.0f, 1); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + GLint maxTextureSize[1] {static_cast(Texture::MAX_RESOLUTION)}; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, maxTextureSize); + if (maxTextureSize[0] > 0) { + Texture::MAX_RESOLUTION = maxTextureSize[0]; + logger.info() << "max texture size is " << Texture::MAX_RESOLUTION; + } + + const GLubyte* vendor = glGetString(GL_VENDOR); + const GLubyte* renderer = glGetString(GL_RENDERER); + logger.info() << "GL Vendor: " << reinterpret_cast(vendor); + logger.info() << "GL Renderer: " << reinterpret_cast(renderer); + logger.info() << "GLFW: " << glfwGetVersionString(); + return false; +} + static const char* glfw_error_name(int error) { switch (error) { case GLFW_NO_ERROR: @@ -124,7 +163,7 @@ static void glfw_error_callback(int error, const char* description) { } inline constexpr short KEYS_BUFFER_SIZE = 1036; -inline constexpr short _MOUSE_KEYS_OFFSET = 1024; +inline constexpr short MOUSE_KEYS_OFFSET = 1024; static GLFWcursor* standard_cursors[static_cast(CursorShape::LAST) + 1] = {}; @@ -201,7 +240,7 @@ public: } void onMouseCallback(int button, bool pressed) { - int key = button + _MOUSE_KEYS_OFFSET; + int key = button + MOUSE_KEYS_OFFSET; onKeyCallback(key, pressed); } @@ -231,12 +270,12 @@ public: bool clicked(mousecode code) const override { return pressed( - static_cast(_MOUSE_KEYS_OFFSET + static_cast(code)) + static_cast(MOUSE_KEYS_OFFSET + static_cast(code)) ); } bool jclicked(mousecode code) const override { return clicked(code) && - frames[static_cast(code) + _MOUSE_KEYS_OFFSET] == + frames[static_cast(code) + MOUSE_KEYS_OFFSET] == currentFrame; } @@ -560,20 +599,34 @@ static void cursor_pos_callback(GLFWwindow* window, double xpos, double ypos) { handler->input.setCursorPosition(xpos, ypos); } +static void create_standard_cursors() { + for (int i = 0; i <= static_cast(CursorShape::LAST); i++) { + int cursor = GLFW_ARROW_CURSOR + i; + // GLFW 3.3 does not support some cursors + if (GLFW_VERSION_MAJOR <= 3 && GLFW_VERSION_MINOR <= 3 && + cursor > GLFW_VRESIZE_CURSOR) { + break; + } + standard_cursors[i] = glfwCreateStandardCursor(cursor); + } +} + +static void setup_callbacks(GLFWwindow* window) { + glfwSetKeyCallback(window, key_callback); + glfwSetMouseButtonCallback(window, mouse_button_callback); + glfwSetCursorPosCallback(window, cursor_pos_callback); + glfwSetWindowSizeCallback(window, window_size_callback); + glfwSetCharCallback(window, character_callback); + glfwSetScrollCallback(window, scroll_callback); +} + std::tuple< std::unique_ptr, std::unique_ptr -> display::initialize(DisplaySettings* settings) { +> Window::initialize(DisplaySettings* settings, std::string title) { int width = settings->width.get(); int height = settings->height.get(); - std::string title = "VoxelCore v" + - std::to_string(ENGINE_VERSION_MAJOR) + "." + - std::to_string(ENGINE_VERSION_MINOR); - if (ENGINE_DEBUG_BUILD) { - title += " [debug]"; - } - glfwSetErrorCallback(glfw_error_callback); if (glfwInit() == GLFW_FALSE) { logger.error() << "failed to initialize GLFW"; @@ -632,34 +685,21 @@ std::tuple< Texture::MAX_RESOLUTION = maxTextureSize[0]; logger.info() << "max texture size is " << Texture::MAX_RESOLUTION; } - - glfwSetKeyCallback(window, key_callback); - glfwSetMouseButtonCallback(window, mouse_button_callback); - glfwSetCursorPosCallback(window, cursor_pos_callback); - glfwSetWindowSizeCallback(window, window_size_callback); - glfwSetCharCallback(window, character_callback); - glfwSetScrollCallback(window, scroll_callback); - + setup_callbacks(window); + glfwSwapInterval(1); - const GLubyte* vendor = glGetString(GL_VENDOR); - const GLubyte* renderer = glGetString(GL_RENDERER); - logger.info() << "GL Vendor: " << reinterpret_cast(vendor); - logger.info() << "GL Renderer: " << reinterpret_cast(renderer); - logger.info() << "GLFW: " << glfwGetVersionString(); + input_util::initialize(); + create_standard_cursors(); + glm::vec2 scale; glfwGetMonitorContentScale(glfwGetPrimaryMonitor(), &scale.x, &scale.y); logger.info() << "monitor content scale: " << scale.x << "x" << scale.y; - input_util::initialize(); - - for (int i = 0; i <= static_cast(CursorShape::LAST); i++) { - int cursor = GLFW_ARROW_CURSOR + i; - // GLFW 3.3 does not support some cursors - if (GLFW_VERSION_MAJOR <= 3 && GLFW_VERSION_MINOR <= 3 && cursor > GLFW_VRESIZE_CURSOR) { - break; - } - standard_cursors[i] = glfwCreateStandardCursor(cursor); + if (initialize_gl(width, height)) { + glfwTerminate(); + return {nullptr, nullptr}; } + auto inputPtr = std::make_unique(window); auto windowPtr = std::make_unique( *inputPtr, window, settings, width, height