From fef3c597d0870219b72e8d0afb5a400d087005bd Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sat, 26 Nov 2022 21:46:57 -0600 Subject: [PATCH] ImGui unique contexts --- .../scwx/qt/manager/resource_manager.cpp | 4 +- scwx-qt/source/scwx/qt/map/map_widget.cpp | 39 ++++++++++++-- .../source/scwx/qt/ui/imgui_debug_dialog.ui | 4 +- .../source/scwx/qt/ui/imgui_debug_widget.cpp | 52 +++++++++++++++++-- 4 files changed, 89 insertions(+), 10 deletions(-) diff --git a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp index ad299533..c5eff320 100644 --- a/scwx-qt/source/scwx/qt/manager/resource_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/resource_manager.cpp @@ -27,6 +27,7 @@ static void LoadTextures(); static void ShutdownImGui(); static std::unique_ptr surface_ {}; +static ImGuiContext* imGuiContext_ {}; void Initialize() { @@ -53,7 +54,7 @@ static void InitializeImGui() } // Initialize ImGui - ImGui::CreateContext(); + imGuiContext_ = ImGui::CreateContext(); ImGui_ImplQt_Init(); ImGui_ImplOpenGL3_Init(); QOpenGLContext::globalShareContext()->doneCurrent(); @@ -89,6 +90,7 @@ static void LoadTextures() static void ShutdownImGui() { QOpenGLContext::globalShareContext()->makeCurrent(surface_.get()); + ImGui::SetCurrentContext(imGuiContext_); ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplQt_Shutdown(); ImGui::DestroyContext(); diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 581d6199..30eca271 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -60,6 +61,7 @@ public: settings_(settings), map_(), layerList_ {}, + imGuiContext_ {ImGui::CreateContext()}, radarProductManager_ {nullptr}, radarProductLayer_ {nullptr}, alertLayer_ {std::make_shared(context_)}, @@ -79,8 +81,31 @@ public: { SetRadarSite(scwx::qt::manager::SettingsManager::general_settings() ->default_radar_site()); + + // Set ImGui Context + ImGui::SetCurrentContext(imGuiContext_); + + // ImGui Configuration + auto& io = ImGui::GetIO(); + + // Disable automatic configuration loading/saving + io.IniFilename = nullptr; + + // Initialize ImGui Qt backend + ImGui_ImplQt_Init(); + ImGui_ImplQt_RegisterWidget(widget_); + } + + ~MapWidgetImpl() + { + // Set ImGui Context + ImGui::SetCurrentContext(imGuiContext_); + + // Shutdown ImGui Context + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplQt_Shutdown(); + ImGui::DestroyContext(imGuiContext_); } - ~MapWidgetImpl() = default; void AddLayer(const std::string& id, std::shared_ptr layer, @@ -103,6 +128,8 @@ public: std::shared_ptr map_; std::list layerList_; + ImGuiContext* imGuiContext_; + std::shared_ptr radarProductManager_; std::shared_ptr colorTable_; @@ -136,6 +163,8 @@ MapWidget::MapWidget(const QMapLibreGL::Settings& settings) : p(std::make_unique(this, settings)) { setFocusPolicy(Qt::StrongFocus); + + ImGui_ImplQt_RegisterWidget(this); } MapWidget::~MapWidget() @@ -644,6 +673,10 @@ void MapWidget::initializeGL() makeCurrent(); p->context_->gl().initializeOpenGLFunctions(); + // Initialize ImGui OpenGL3 backend + ImGui::SetCurrentContext(p->imGuiContext_); + ImGui_ImplOpenGL3_Init(); + p->map_.reset( new QMapLibreGL::Map(nullptr, p->settings_, size(), pixelRatio())); p->context_->set_map(p->map_); @@ -686,10 +719,10 @@ void MapWidget::paintGL() p->frameDraws_++; // Setup ImGui Frame - ImGui::GetIO().DisplaySize = {static_cast(size().width()), - static_cast(size().height())}; + ImGui::SetCurrentContext(p->imGuiContext_); // Start ImGui Frame + ImGui_ImplQt_NewFrame(this); ImGui_ImplOpenGL3_NewFrame(); ImGui::NewFrame(); diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui index a2790a62..5752a7c1 100644 --- a/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_dialog.ui @@ -6,8 +6,8 @@ 0 0 - 570 - 760 + 592 + 754 diff --git a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp index 63998602..0764cf62 100644 --- a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp @@ -16,33 +16,77 @@ static const std::string logPrefix_ = "scwx::qt::ui::imgui_debug_widget"; class ImGuiDebugWidgetImpl { public: - explicit ImGuiDebugWidgetImpl(ImGuiDebugWidget* self) : self_ {self} + explicit ImGuiDebugWidgetImpl(ImGuiDebugWidget* self) : + self_ {self}, context_ {ImGui::CreateContext()} { + // Set ImGui Context + ImGui::SetCurrentContext(context_); + // ImGui Configuration auto& io = ImGui::GetIO(); - // Initialize Qt backend + // Disable automatic configuration loading/saving + io.IniFilename = nullptr; + + // Initialize ImGui Qt backend + ImGui_ImplQt_Init(); ImGui_ImplQt_RegisterWidget(self_); } - ~ImGuiDebugWidgetImpl() {} + + ~ImGuiDebugWidgetImpl() + { + // Set ImGui Context + ImGui::SetCurrentContext(context_); + + // Shutdown ImGui Context + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplQt_Shutdown(); + ImGui::DestroyContext(context_); + } ImGuiDebugWidget* self_; + ImGuiContext* context_; + + bool firstRender_ {true}; }; ImGuiDebugWidget::ImGuiDebugWidget(QWidget* parent) : QOpenGLWidget(parent), p {std::make_unique(this)} { + // Accept focus for keyboard events + setFocusPolicy(Qt::StrongFocus); } -void ImGuiDebugWidget::initializeGL() {} +void ImGuiDebugWidget::initializeGL() +{ + makeCurrent(); + + // Initialize ImGui OpenGL3 backend + ImGui::SetCurrentContext(p->context_); + ImGui_ImplOpenGL3_Init(); +} void ImGuiDebugWidget::paintGL() { + ImGui::SetCurrentContext(p->context_); + ImGui_ImplQt_NewFrame(this); ImGui_ImplOpenGL3_NewFrame(); ImGui::NewFrame(); + if (p->firstRender_) + { + // Set initial position of demo window + ImGui::SetNextWindowPos(ImVec2 {width() / 2.0f, height() / 2.0f}, + ImGuiCond_FirstUseEver, + ImVec2 {0.5f, 0.5f}); + ImGui::Begin("Dear ImGui Demo"); + ImGui::End(); + + p->firstRender_ = false; + } + ImGui::ShowDemoWindow(); ImGui::Render();