From 4f22d5daca7d570dbd3caf3da18448350bf5f148 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 14 Dec 2021 02:11:02 +0000 Subject: Single glContext shared between windows Created by the first window, includes simplified refresh/render for single control point --- ui/window.cpp | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) (limited to 'ui/window.cpp') diff --git a/ui/window.cpp b/ui/window.cpp index c451367..2dc0c2a 100644 --- a/ui/window.cpp +++ b/ui/window.cpp @@ -1,32 +1,42 @@ #include "window.h" #include "ui/inputHandler.h" #include +#include #include -Window::Window(int width, int height, const std::string & title) : - m_window {title.c_str(), static_cast(SDL_WINDOWPOS_CENTERED), static_cast(SDL_WINDOWPOS_CENTERED), width, - height, static_cast(SDL_WINDOW_OPENGL)}, - m_glContext {m_window} +static SDL_GLContext +SDL_GL_CreateContextAndGlewInit(SDL_Window * w) { + auto ctx = SDL_GL_CreateContext(w); if (glewInit() != GLEW_OK) { throw std::runtime_error {"Glew failed to initialize!"}; } - glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + return ctx; +} + +using GL_Context = std::remove_pointer_t; +using SDL_GLContextPtr = wrapped_ptrt; + +Window::Window(int width, int height, const std::string & title) : + m_window {title.c_str(), static_cast(SDL_WINDOWPOS_CENTERED), static_cast(SDL_WINDOWPOS_CENTERED), width, + height, static_cast(SDL_WINDOW_OPENGL)} +{ + glContext(); } void -Window::Clear(float r, float g, float b, float a) const +Window::clear(float r, float g, float b, float a) const { glClearColor(r, g, b, a); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } void -Window::SwapBuffers() const +Window::swapBuffers() const { SDL_GL_SwapWindow(m_window); } @@ -40,3 +50,21 @@ 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 GameState * gameState) const +{ + SDL_GL_MakeCurrent(m_window, glContext()); + clear(0.0F, 0.0F, 0.0F, 1.0F); + + render(gameState); + + swapBuffers(); +} -- cgit v1.2.3