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 --- application/main.cpp | 4 +--- ui/gameMainWindow.cpp | 3 +-- ui/gameMainWindow.h | 2 +- ui/window.cpp | 42 +++++++++++++++++++++++++++++++++++------- ui/window.h | 13 +++++++------ 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/application/main.cpp b/application/main.cpp index 9992ec0..68bc191 100644 --- a/application/main.cpp +++ b/application/main.cpp @@ -101,9 +101,7 @@ public: world.apply(&WorldObject::tick, t_passed); windows.apply(&Window::tick, t_passed); - windows.apply(&Window::Clear, 0.0F, 0.0F, 0.0F, 1.0F); - windows.apply(&Window::Refresh, this); - windows.apply(&Window::SwapBuffers); + windows.apply(&Window::refresh, this); t_start = t_end; } diff --git a/ui/gameMainWindow.cpp b/ui/gameMainWindow.cpp index 4421098..7d5e19b 100644 --- a/ui/gameMainWindow.cpp +++ b/ui/gameMainWindow.cpp @@ -33,9 +33,8 @@ GameMainWindow::tick(TickDuration) } void -GameMainWindow::Refresh(const GameState * gameState) const +GameMainWindow::render(const GameState * gameState) const { - SDL_GL_MakeCurrent(m_window, m_glContext); glEnable(GL_DEPTH_TEST); gameState->world.apply(&Renderable::render, shader); glDisable(GL_DEPTH_TEST); diff --git a/ui/gameMainWindow.h b/ui/gameMainWindow.h index affb389..124d776 100644 --- a/ui/gameMainWindow.h +++ b/ui/gameMainWindow.h @@ -16,7 +16,7 @@ public: void tick(TickDuration) override; - void Refresh(const GameState * gameState) const override; + void render(const GameState * gameState) const override; private: UIShader uiShader; 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(); +} diff --git a/ui/window.h b/ui/window.h index f6279e2..8bfc9c3 100644 --- a/ui/window.h +++ b/ui/window.h @@ -20,18 +20,19 @@ public: NO_COPY(Window); NO_MOVE(Window); - void Clear(float r, float g, float b, float a) const; - void SwapBuffers() const; virtual void tick(TickDuration elapsed) = 0; - virtual void Refresh(const GameState *) const = 0; + void refresh(const GameState *) const; bool handleInput(const SDL_Event & e); + void clear(float r, float g, float b, float a) const; + void swapBuffers() const; + protected: - using GL_Context = std::remove_pointer_t; + SDL_GLContext glContext() const; + virtual void render(const GameState *) const = 0; + using SDL_WindowPtr = wrapped_ptrt; - using SDL_GLContextPtr = wrapped_ptrt; SDL_WindowPtr m_window; - SDL_GLContextPtr m_glContext; Collection inputStack; }; -- cgit v1.2.3