From dc96e3e3ad1d5f3b2d7bc616a6a0023e5edfd59e Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 27 Aug 2025 22:48:49 -0500 Subject: [PATCH] Update ImGui to v1.92.2b --- external/imgui | 2 +- .../source/scwx/qt/gl/draw/placefile_text.cpp | 2 +- .../source/scwx/qt/manager/font_manager.cpp | 20 +--------- .../source/scwx/qt/manager/font_manager.hpp | 1 - scwx-qt/source/scwx/qt/map/draw_layer.cpp | 3 +- scwx-qt/source/scwx/qt/map/map_widget.cpp | 37 ++----------------- scwx-qt/source/scwx/qt/map/overlay_layer.cpp | 2 +- .../scwx/qt/model/imgui_context_model.cpp | 25 +++++++++---- .../scwx/qt/model/imgui_context_model.hpp | 12 ++---- .../source/scwx/qt/ui/imgui_debug_widget.cpp | 37 ++----------------- scwx-qt/source/scwx/qt/util/imgui.cpp | 2 +- 11 files changed, 35 insertions(+), 108 deletions(-) diff --git a/external/imgui b/external/imgui index 993fa347..45acd5e0 160000 --- a/external/imgui +++ b/external/imgui @@ -1 +1 @@ -Subproject commit 993fa347495860ed44b83574254ef2a317d0c14f +Subproject commit 45acd5e0e82f4c954432533ae9985ff0e1aad6d5 diff --git a/scwx-qt/source/scwx/qt/gl/draw/placefile_text.cpp b/scwx-qt/source/scwx/qt/gl/draw/placefile_text.cpp index 93aa4461..aee2d884 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/placefile_text.cpp +++ b/scwx-qt/source/scwx/qt/gl/draw/placefile_text.cpp @@ -159,7 +159,7 @@ void PlacefileText::Impl::RenderTextDrawItem( std::size_t fontNumber = std::clamp(di->fontNumber_, 0, 8); // Set the font for the drop shadow and text - ImGui::PushFont(fonts_[fontNumber]->font()); + ImGui::PushFont(fonts_[fontNumber]->font(), 0.0f); if (settings::TextSettings::Instance() .placefile_text_drop_shadow_enabled() diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.cpp b/scwx-qt/source/scwx/qt/manager/font_manager.cpp index 28c7b515..d492a5be 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.cpp @@ -18,11 +18,7 @@ #include #include -namespace scwx -{ -namespace qt -{ -namespace manager +namespace scwx::qt::manager { static const std::string logPrefix_ = "scwx::qt::manager::font_manager"; @@ -81,8 +77,6 @@ public: std::shared_mutex imguiFontAtlasMutex_ {}; - std::uint64_t imguiFontsBuildCount_ {}; - boost::unordered_flat_map, FontRecordHash> @@ -207,11 +201,6 @@ std::shared_mutex& FontManager::imgui_font_atlas_mutex() return p->imguiFontAtlasMutex_; } -std::uint64_t FontManager::imgui_fonts_build_count() const -{ - return p->imguiFontsBuildCount_; -} - int FontManager::GetFontId(types::Font font) const { auto it = p->fontIds_.find(font); @@ -327,9 +316,6 @@ FontManager::LoadImGuiFont(const std::string& family, // Store the ImGui font p->imguiFonts_.insert_or_assign(imguiFontKey, imguiFont); - // Increment ImGui font build count - ++p->imguiFontsBuildCount_; - // Return the ImGui font return imguiFont; } @@ -585,6 +571,4 @@ bool operator==(const FontRecord& lhs, const FontRecord& rhs) lhs.filename_ == rhs.filename_; } -} // namespace manager -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::manager diff --git a/scwx-qt/source/scwx/qt/manager/font_manager.hpp b/scwx-qt/source/scwx/qt/manager/font_manager.hpp index e52d0d16..26d5484b 100644 --- a/scwx-qt/source/scwx/qt/manager/font_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/font_manager.hpp @@ -26,7 +26,6 @@ public: ~FontManager(); std::shared_mutex& imgui_font_atlas_mutex(); - std::uint64_t imgui_fonts_build_count() const; int GetFontId(types::Font font) const; std::shared_ptr diff --git a/scwx-qt/source/scwx/qt/map/draw_layer.cpp b/scwx-qt/source/scwx/qt/map/draw_layer.cpp index 755b9925..c59ed79f 100644 --- a/scwx-qt/source/scwx/qt/map/draw_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/draw_layer.cpp @@ -98,10 +98,11 @@ void DrawLayer::ImGuiFrameStart(const std::shared_ptr& mapContext) ImGui::SetCurrentContext(p->imGuiContext_); // Start ImGui Frame + model::ImGuiContextModel::Instance().NewFrame(); ImGui_ImplQt_NewFrame(mapContext->widget()); ImGui_ImplOpenGL3_NewFrame(); ImGui::NewFrame(); - ImGui::PushFont(defaultFont->font()); + ImGui::PushFont(defaultFont->font(), 0.0f); } void DrawLayer::ImGuiFrameEnd() diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index d619de79..5426734c 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -172,7 +172,6 @@ public: void HandleHotkeyReleased(types::Hotkey hotkey); void HandleHotkeyUpdates(); void HandlePinchGesture(QPinchGesture* gesture); - void ImGuiCheckFonts(); void InitializeCustomStyles(); void InitializeNewRadarProductView(const std::string& colorPalette); void RadarProductManagerConnect(); @@ -222,8 +221,7 @@ public: ImGuiContext* imGuiContext_; std::string imGuiContextName_; - bool imGuiRendererInitialized_; - std::uint64_t imGuiFontsBuildCount_ {}; + bool imGuiRendererInitialized_ {false}; std::shared_ptr layerModel_ { model::LayerModel::Instance()}; @@ -1575,8 +1573,6 @@ void MapWidget::initializeGL() ImGui::SetCurrentContext(p->imGuiContext_); ImGui_ImplQt_RegisterWidget(this); ImGui_ImplOpenGL3_Init(); - p->imGuiFontsBuildCount_ = - manager::FontManager::Instance().imgui_fonts_build_count(); p->imGuiRendererInitialized_ = true; p->map_.reset( @@ -1628,10 +1624,6 @@ void MapWidget::paintGL() std::shared_lock imguiFontAtlasLock { manager::FontManager::Instance().imgui_font_atlas_mutex()}; - // Check ImGui fonts - ImGui::SetCurrentContext(p->imGuiContext_); - p->ImGuiCheckFonts(); - // Update pixel ratio p->context_->set_pixel_ratio(pixelRatio()); @@ -1646,12 +1638,13 @@ void MapWidget::paintGL() ImGui::SetCurrentContext(p->imGuiContext_); // Start ImGui Frame + model::ImGuiContextModel::Instance().NewFrame(); ImGui_ImplQt_NewFrame(this); ImGui_ImplOpenGL3_NewFrame(); ImGui::NewFrame(); // Set default font - ImGui::PushFont(defaultFont->font()); + ImGui::PushFont(defaultFont->font(), 0.0f); // Perform mouse picking if (p->hasMouse_) @@ -1682,30 +1675,6 @@ void MapWidget::paintGL() p->isPainting_ = false; } -void MapWidgetImpl::ImGuiCheckFonts() -{ - // Update ImGui Fonts if required - std::uint64_t currentImGuiFontsBuildCount = - manager::FontManager::Instance().imgui_fonts_build_count(); - - if (imGuiFontsBuildCount_ != currentImGuiFontsBuildCount || - !model::ImGuiContextModel::Instance().font_atlas()->IsBuilt()) - { - ImGui_ImplOpenGL3_DestroyFontsTexture(); - ImGui_ImplOpenGL3_CreateFontsTexture(); - } - - static bool haveLogged = false; - if (!model::ImGuiContextModel::Instance().font_atlas()->IsBuilt() && - !haveLogged) - { - logger_->error("ImGui font atlas could not be built."); - haveLogged = true; - } - - imGuiFontsBuildCount_ = currentImGuiFontsBuildCount; -} - void MapWidgetImpl::RunMousePicking() { const QMapLibre::CustomLayerRenderParameters params = { diff --git a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp index 50311b83..8c60bc33 100644 --- a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp @@ -539,7 +539,7 @@ void OverlayLayer::Render(const std::shared_ptr& mapContext, ImVec2 {1.0f, 1.0f}); ImGui::SetNextWindowBgAlpha(0.5f); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2 {3.0f, 2.0f}); - ImGui::PushFont(attributionFont->font()); + ImGui::PushFont(attributionFont->font(), 0.0f); ImGui::Begin("Attribution", nullptr, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | diff --git a/scwx-qt/source/scwx/qt/model/imgui_context_model.cpp b/scwx-qt/source/scwx/qt/model/imgui_context_model.cpp index 37ca523f..33cbfe79 100644 --- a/scwx-qt/source/scwx/qt/model/imgui_context_model.cpp +++ b/scwx-qt/source/scwx/qt/model/imgui_context_model.cpp @@ -4,11 +4,12 @@ #include -namespace scwx -{ -namespace qt -{ -namespace model +// Expose required functions from internal API +void ImFontAtlasUpdateNewFrame(ImFontAtlas* atlas, + int frame_count, + bool renderer_has_textures); + +namespace scwx::qt::model { static const std::string logPrefix_ = "scwx::qt::model::imgui_context_model"; @@ -23,6 +24,8 @@ public: std::vector contexts_ {}; ImFontAtlas fontAtlas_ {}; + + int frameCount_ {0}; }; ImGuiContextModel::ImGuiContextModel() : @@ -135,6 +138,14 @@ void ImGuiContextModel::DestroyContext(const std::string& name) } } +void ImGuiContextModel::NewFrame() +{ + static constexpr bool kRendererHasTextures_ = true; + + ImFontAtlasUpdateNewFrame( + &p->fontAtlas_, ++p->frameCount_, kRendererHasTextures_); +} + std::vector ImGuiContextModel::contexts() const { return p->contexts_; @@ -153,6 +164,4 @@ ImGuiContextModel& ImGuiContextModel::Instance() bool ImGuiContextInfo::operator==(const ImGuiContextInfo& o) const = default; -} // namespace model -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::model diff --git a/scwx-qt/source/scwx/qt/model/imgui_context_model.hpp b/scwx-qt/source/scwx/qt/model/imgui_context_model.hpp index 894931c5..926501fc 100644 --- a/scwx-qt/source/scwx/qt/model/imgui_context_model.hpp +++ b/scwx-qt/source/scwx/qt/model/imgui_context_model.hpp @@ -8,11 +8,7 @@ struct ImFontAtlas; struct ImGuiContext; -namespace scwx -{ -namespace qt -{ -namespace model +namespace scwx::qt::model { class ImGuiContextModelImpl; @@ -46,6 +42,8 @@ public: ImGuiContext* CreateContext(const std::string& name); void DestroyContext(const std::string& name); + void NewFrame(); + std::vector contexts() const; ImFontAtlas* font_atlas(); @@ -59,6 +57,4 @@ private: std::unique_ptr p; }; -} // namespace model -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::model 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 860f5612..541c8e3e 100644 --- a/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/imgui_debug_widget.cpp @@ -9,11 +9,7 @@ #include #include -namespace scwx -{ -namespace qt -{ -namespace ui +namespace scwx::qt::ui { static const std::string logPrefix_ = "scwx::qt::ui::imgui_debug_widget"; @@ -51,8 +47,6 @@ public: model::ImGuiContextModel::Instance().DestroyContext(contextName_); } - void ImGuiCheckFonts(); - ImGuiDebugWidget* self_; ImGuiContext* context_; std::string contextName_; @@ -61,7 +55,6 @@ public: std::set renderedSet_ {}; bool imGuiRendererInitialized_ {false}; - std::uint64_t imGuiFontsBuildCount_ {}; }; ImGuiDebugWidget::ImGuiDebugWidget(QWidget* parent) : @@ -106,8 +99,6 @@ void ImGuiDebugWidget::initializeGL() // Initialize ImGui OpenGL3 backend ImGui::SetCurrentContext(p->context_); ImGui_ImplOpenGL3_Init(); - p->imGuiFontsBuildCount_ = - manager::FontManager::Instance().imgui_fonts_build_count(); p->imGuiRendererInitialized_ = true; } @@ -122,9 +113,9 @@ void ImGuiDebugWidget::paintGL() std::shared_lock imguiFontAtlasLock { manager::FontManager::Instance().imgui_font_atlas_mutex()}; + model::ImGuiContextModel::Instance().NewFrame(); ImGui_ImplQt_NewFrame(this); ImGui_ImplOpenGL3_NewFrame(); - p->ImGuiCheckFonts(); ImGui::NewFrame(); if (!p->renderedSet_.contains(p->currentContext_)) @@ -149,26 +140,4 @@ void ImGuiDebugWidget::paintGL() imguiFontAtlasLock.unlock(); } -void ImGuiDebugWidgetImpl::ImGuiCheckFonts() -{ - // Update ImGui Fonts if required - std::uint64_t currentImGuiFontsBuildCount = - manager::FontManager::Instance().imgui_fonts_build_count(); - - if ((context_ == currentContext_ && - imGuiFontsBuildCount_ != currentImGuiFontsBuildCount) || - !model::ImGuiContextModel::Instance().font_atlas()->IsBuilt()) - { - ImGui_ImplOpenGL3_DestroyFontsTexture(); - ImGui_ImplOpenGL3_CreateFontsTexture(); - } - - if (context_ == currentContext_) - { - imGuiFontsBuildCount_ = currentImGuiFontsBuildCount; - } -} - -} // namespace ui -} // namespace qt -} // namespace scwx +} // namespace scwx::qt::ui diff --git a/scwx-qt/source/scwx/qt/util/imgui.cpp b/scwx-qt/source/scwx/qt/util/imgui.cpp index 64076dab..1fa857c8 100644 --- a/scwx-qt/source/scwx/qt/util/imgui.cpp +++ b/scwx-qt/source/scwx/qt/util/imgui.cpp @@ -34,7 +34,7 @@ void ImGui::DrawTooltip(const std::string& hoverText) if (::ImGui::BeginTooltip()) { - ::ImGui::PushFont(tooltipFont->font()); + ::ImGui::PushFont(tooltipFont->font(), 0.0f); ::ImGui::TextUnformatted(hoverText.c_str()); ::ImGui::PopFont(); ::ImGui::EndTooltip();