From dd1b4f27c89b5baeed26e2518f843ecbbd1e8312 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 20 Nov 2022 22:12:05 -0600 Subject: [PATCH] Connect ImGui render to QOpenGLWidgets --- scwx-qt/source/scwx/qt/main/main.cpp | 7 ++- .../scwx/qt/manager/resource_manager.cpp | 56 +++++++++++++++++-- .../scwx/qt/manager/resource_manager.hpp | 3 +- scwx-qt/source/scwx/qt/map/map_widget.cpp | 16 ++++++ 4 files changed, 76 insertions(+), 6 deletions(-) diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index 594d9a53..b360aa1e 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -21,6 +21,8 @@ int main(int argc, char* argv[]) scwx::util::Logger::Initialize(); spdlog::set_level(spdlog::level::debug); + QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); + QApplication a(argc, argv); QCoreApplication::setApplicationName("Supercell Wx"); @@ -61,7 +63,7 @@ int main(int argc, char* argv[]) // Initialize application scwx::qt::config::RadarSite::Initialize(); scwx::qt::manager::SettingsManager::Initialize(); - scwx::qt::manager::ResourceManager::PreLoad(); + scwx::qt::manager::ResourceManager::Initialize(); // Run Qt main loop int result; @@ -78,6 +80,9 @@ int main(int argc, char* argv[]) work.reset(); threadPool.join(); + // Shutdown application + scwx::qt::manager::ResourceManager::Shutdown(); + // Shutdown AWS SDK Aws::ShutdownAPI(awsSdkOptions); diff --git a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp index c8cceb1d..ffbd364f 100644 --- a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp @@ -2,6 +2,12 @@ #include #include #include +#include + +#include +#include +#include +#include namespace scwx { @@ -11,20 +17,54 @@ namespace manager { namespace ResourceManager { -static void LoadFonts(); +static const std::string logPrefix_ = "scwx::qt::manager::ResourceManager"; +static const auto logger_ = scwx::util::Logger::Create(logPrefix_); -void PreLoad() +static void InitializeImGui(); +static void LoadFonts(); +static void LoadTextures(); +static void ShutdownImGui(); + +static std::unique_ptr surface_ {}; + +void Initialize() { + config::CountyDatabase::Initialize(); + + InitializeImGui(); LoadFonts(); + LoadTextures(); +} + +void Shutdown() +{ + ShutdownImGui(); +} + +static void InitializeImGui() +{ + // Create OpenGL Offscreen Surface + surface_ = std::make_unique(); + surface_->create(); + if (!QOpenGLContext::globalShareContext()->makeCurrent(surface_.get())) + { + logger_->warn("Failed to initialize offscreen surface"); + } + + // Initialize ImGui + ImGui::CreateContext(); + ImGui_ImplOpenGL3_Init(); + QOpenGLContext::globalShareContext()->doneCurrent(); } static void LoadFonts() { - config::CountyDatabase::Initialize(); - util::Font::Create(":/res/fonts/din1451alt.ttf"); util::Font::Create(":/res/fonts/din1451alt_g.ttf"); +} +static void LoadTextures() +{ util::TextureAtlas& textureAtlas = util::TextureAtlas::Instance(); textureAtlas.RegisterTexture("lines/default-1x7", ":/res/textures/lines/default-1x7.png"); @@ -33,6 +73,14 @@ static void LoadFonts() textureAtlas.BuildAtlas(8, 8); } +static void ShutdownImGui() +{ + QOpenGLContext::globalShareContext()->makeCurrent(surface_.get()); + ImGui_ImplOpenGL3_Shutdown(); + ImGui::DestroyContext(); + QOpenGLContext::globalShareContext()->doneCurrent(); +} + } // namespace ResourceManager } // namespace manager } // namespace qt diff --git a/scwx-qt/source/scwx/qt/manager/resource_manager.hpp b/scwx-qt/source/scwx/qt/manager/resource_manager.hpp index ee30bb8f..797779d2 100644 --- a/scwx-qt/source/scwx/qt/manager/resource_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/resource_manager.hpp @@ -8,7 +8,8 @@ namespace manager { namespace ResourceManager { -void PreLoad(); +void Initialize(); +void Shutdown(); } // namespace ResourceManager } // namespace manager } // namespace qt diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 1a635255..581d6199 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -13,6 +13,8 @@ #include #include +#include +#include #include #include #include @@ -682,10 +684,24 @@ void MapWidget::initializeGL() void MapWidget::paintGL() { p->frameDraws_++; + + // Setup ImGui Frame + ImGui::GetIO().DisplaySize = {static_cast(size().width()), + static_cast(size().height())}; + + // Start ImGui Frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui::NewFrame(); + + // Render QMapLibreGL Map p->map_->resize(size()); p->map_->setFramebufferObject(defaultFramebufferObject(), size() * pixelRatio()); p->map_->render(); + + // Render ImGui Frame + ImGui::Render(); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); } void MapWidget::mapChanged(QMapLibreGL::Map::MapChange mapChange)