From 82bfbf1f459d540b0e204bb873ca5786997b24da Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 12 Nov 2022 11:38:34 +0000 Subject: Refactor for per window context and more setup to the right places --- gfx/models/texture.cpp | 1 + ui/sceneRenderer.cpp | 3 +++ ui/window.cpp | 40 +++++++++++----------------------------- ui/window.h | 8 +++++++- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/gfx/models/texture.cpp b/gfx/models/texture.cpp index ff38d0f..ab1a5fe 100644 --- a/gfx/models/texture.cpp +++ b/gfx/models/texture.cpp @@ -23,6 +23,7 @@ Texture::Texture(const Image & tex) : Texture::Texture(GLsizei width, GLsizei height, const void * data) { glBindTexture(GL_TEXTURE_2D, m_texture); + 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); diff --git a/ui/sceneRenderer.cpp b/ui/sceneRenderer.cpp index 6e75dec..5ef0379 100644 --- a/ui/sceneRenderer.cpp +++ b/ui/sceneRenderer.cpp @@ -51,6 +51,9 @@ SceneRenderer::render(std::function content) const { // Geometry pass glEnable(GL_BLEND); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/ui/window.cpp b/ui/window.cpp index 82f4d40..0d4c401 100644 --- a/ui/window.cpp +++ b/ui/window.cpp @@ -7,35 +7,24 @@ #include #include -static SDL_GLContext -SDL_GL_CreateContextAndGlewInit(SDL_Window * w) +Window::GlewInitHelper::GlewInitHelper() { - auto ctx = SDL_GL_CreateContext(w); - if (glewInit() != GLEW_OK) { - throw std::runtime_error {"Glew failed to initialize!"}; - } - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - return ctx; + [[maybe_unused]] static auto init = []() { + if (const auto r = glewInit(); r != GLEW_OK) { + throw std::runtime_error {reinterpret_cast(glewGetErrorString(r))}; + } + else { + return r; + } + }(); } -using GL_Context = std::remove_pointer_t; -using SDL_GLContextPtr = wrapped_ptrt; - Window::Window(size_t width, size_t height, const std::string & title) : size {static_cast(width), static_cast(height)}, m_window {title.c_str(), static_cast(SDL_WINDOWPOS_CENTERED), static_cast(SDL_WINDOWPOS_CENTERED), size.x, size.y, static_cast(SDL_WINDOW_OPENGL)}, - uiShader {[this](auto w) { - // must call glContent before creating the shader - std::ignore = glContext(); - return w; - }(width), - height} + glContext {m_window}, uiShader {width, height} { } @@ -73,17 +62,10 @@ Window::handleInput(const SDL_Event & e) return false; } -SDL_GLContext -Window::glContext() const -{ - static SDL_GLContextPtr m_glContext {m_window}; - return m_glContext; -} - void Window::refresh() const { - SDL_GL_MakeCurrent(m_window, glContext()); + SDL_GL_MakeCurrent(m_window, glContext); clear(0.0F, 0.0F, 0.0F, 1.0F); render(); diff --git a/ui/window.h b/ui/window.h index 0661915..d618976 100644 --- a/ui/window.h +++ b/ui/window.h @@ -26,12 +26,18 @@ public: void swapBuffers() const; protected: - [[nodiscard]] SDL_GLContext glContext() const; virtual void render() const; + struct GlewInitHelper { + GlewInitHelper(); + }; using SDL_WindowPtr = wrapped_ptrt; + using GL_Context = std::remove_pointer_t; + using SDL_GLContextPtr = wrapped_ptrt; const glm::ivec2 size; SDL_WindowPtr m_window; + SDL_GLContextPtr glContext; + GlewInitHelper glewinithelper; Collection uiComponents; UIShader uiShader; }; -- cgit v1.2.3