mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 10:30:06 +00:00 
			
		
		
		
	Inital code for per map layer ImGui contexts
This commit is contained in:
		
							parent
							
								
									e641c0b0e5
								
							
						
					
					
						commit
						6d107f6c2d
					
				
					 7 changed files with 153 additions and 15 deletions
				
			
		|  | @ -1,7 +1,14 @@ | ||||||
|  | #include <scwx/qt/manager/font_manager.hpp> | ||||||
| #include <scwx/qt/map/draw_layer.hpp> | #include <scwx/qt/map/draw_layer.hpp> | ||||||
|  | #include <scwx/qt/model/imgui_context_model.hpp> | ||||||
| #include <scwx/qt/gl/shader_program.hpp> | #include <scwx/qt/gl/shader_program.hpp> | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
| 
 | 
 | ||||||
|  | #include <backends/imgui_impl_opengl3.h> | ||||||
|  | #include <backends/imgui_impl_qt.hpp> | ||||||
|  | #include <fmt/format.h> | ||||||
|  | #include <imgui.h> | ||||||
|  | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
| namespace qt | namespace qt | ||||||
|  | @ -16,18 +23,65 @@ class DrawLayerImpl | ||||||
| { | { | ||||||
| public: | public: | ||||||
|    explicit DrawLayerImpl(std::shared_ptr<MapContext> context) : |    explicit DrawLayerImpl(std::shared_ptr<MapContext> context) : | ||||||
|        context_ {context}, drawList_ {}, textureAtlas_ {GL_INVALID_INDEX} |        context_ {context}, | ||||||
|  |        drawList_ {}, | ||||||
|  |        textureAtlas_ {GL_INVALID_INDEX}, | ||||||
|  |        imGuiRendererInitialized_ {false} | ||||||
|    { |    { | ||||||
|  |       static size_t currentMapId_ {0u}; | ||||||
|  |       imGuiContextName_ = fmt::format("Layer {}", ++currentMapId_); | ||||||
|  |       imGuiContext_ =  | ||||||
|  |          model::ImGuiContextModel::Instance().CreateContext(imGuiContextName_); | ||||||
|  | 
 | ||||||
|  |       // Initialize ImGui Qt backend
 | ||||||
|  |       ImGui_ImplQt_Init(); | ||||||
|    } |    } | ||||||
|    ~DrawLayerImpl() {} |    ~DrawLayerImpl() | ||||||
|  |    { | ||||||
|  |       // Set ImGui Context
 | ||||||
|  |       ImGui::SetCurrentContext(imGuiContext_); | ||||||
|  | 
 | ||||||
|  |       // Shutdown ImGui Context
 | ||||||
|  |       if (imGuiRendererInitialized_) | ||||||
|  |       { | ||||||
|  |          ImGui_ImplOpenGL3_Shutdown(); | ||||||
|  |       } | ||||||
|  |       ImGui_ImplQt_Shutdown(); | ||||||
|  | 
 | ||||||
|  |       // Destroy ImGui Context
 | ||||||
|  |       model::ImGuiContextModel::Instance().DestroyContext(imGuiContextName_); | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    void ImGuiCheckFonts(); | ||||||
| 
 | 
 | ||||||
|    std::shared_ptr<MapContext>                      context_; |    std::shared_ptr<MapContext>                      context_; | ||||||
|    std::vector<std::shared_ptr<gl::draw::DrawItem>> drawList_; |    std::vector<std::shared_ptr<gl::draw::DrawItem>> drawList_; | ||||||
|    GLuint                                           textureAtlas_; |    GLuint                                           textureAtlas_; | ||||||
| 
 | 
 | ||||||
|    std::uint64_t textureAtlasBuildCount_ {}; |    std::uint64_t textureAtlasBuildCount_ {}; | ||||||
|  | 
 | ||||||
|  |    std::string imGuiContextName_; | ||||||
|  |    ImGuiContext* imGuiContext_; | ||||||
|  |    bool          imGuiRendererInitialized_; | ||||||
|  |    std::uint64_t imGuiFontsBuildCount_ {}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | void DrawLayerImpl::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(); | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    imGuiFontsBuildCount_ = currentImGuiFontsBuildCount; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| DrawLayer::DrawLayer(const std::shared_ptr<MapContext>& context) : | DrawLayer::DrawLayer(const std::shared_ptr<MapContext>& context) : | ||||||
|     GenericLayer(context), p(std::make_unique<DrawLayerImpl>(context)) |     GenericLayer(context), p(std::make_unique<DrawLayerImpl>(context)) | ||||||
| { | { | ||||||
|  | @ -42,9 +96,48 @@ void DrawLayer::Initialize() | ||||||
|    { |    { | ||||||
|       item->Initialize(); |       item->Initialize(); | ||||||
|    } |    } | ||||||
|  | 
 | ||||||
|  |    ImGuiInitialize(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void DrawLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | void DrawLayer::StartImGuiFrame() | ||||||
|  | { | ||||||
|  |    auto defaultFont = manager::FontManager::Instance().GetImGuiFont( | ||||||
|  |       types::FontCategory::Default); | ||||||
|  | 
 | ||||||
|  |    // Setup ImGui Frame
 | ||||||
|  |    ImGui::SetCurrentContext(p->imGuiContext_); | ||||||
|  | 
 | ||||||
|  |    // Start ImGui Frame
 | ||||||
|  |    ImGui_ImplQt_NewFrame(p->context_->widget()); | ||||||
|  |    ImGui_ImplOpenGL3_NewFrame(); | ||||||
|  |    p->ImGuiCheckFonts(); | ||||||
|  |    ImGui::NewFrame(); | ||||||
|  |    ImGui::PushFont(defaultFont->font()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void DrawLayer::EndImGuiFrame() | ||||||
|  | { | ||||||
|  |    // Pop default font
 | ||||||
|  |    ImGui::PopFont(); | ||||||
|  | 
 | ||||||
|  |    // Render ImGui Frame
 | ||||||
|  |    ImGui::Render(); | ||||||
|  |    ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void DrawLayer::ImGuiInitialize() | ||||||
|  | { | ||||||
|  |    ImGui::SetCurrentContext(p->imGuiContext_); | ||||||
|  |    ImGui_ImplQt_RegisterWidget(p->context_->widget()); | ||||||
|  |    ImGui_ImplOpenGL3_Init(); | ||||||
|  |    p->imGuiFontsBuildCount_ = | ||||||
|  |       manager::FontManager::Instance().imgui_fonts_build_count(); | ||||||
|  |    p->imGuiRendererInitialized_ = true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void DrawLayer::RenderWithoutImGui( | ||||||
|  |    const QMapLibre::CustomLayerRenderParameters& params) | ||||||
| { | { | ||||||
|    gl::OpenGLFunctions& gl = p->context_->gl(); |    gl::OpenGLFunctions& gl = p->context_->gl(); | ||||||
|    p->textureAtlas_        = p->context_->GetTextureAtlas(); |    p->textureAtlas_        = p->context_->GetTextureAtlas(); | ||||||
|  | @ -69,6 +162,13 @@ void DrawLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | ||||||
|    p->textureAtlasBuildCount_ = newTextureAtlasBuildCount; |    p->textureAtlasBuildCount_ = newTextureAtlasBuildCount; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |    void DrawLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | ||||||
|  | { | ||||||
|  |    StartImGuiFrame(); | ||||||
|  |    RenderWithoutImGui(params); | ||||||
|  |    EndImGuiFrame(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void DrawLayer::Deinitialize() | void DrawLayer::Deinitialize() | ||||||
| { | { | ||||||
|    p->textureAtlas_ = GL_INVALID_INDEX; |    p->textureAtlas_ = GL_INVALID_INDEX; | ||||||
|  |  | ||||||
|  | @ -32,6 +32,11 @@ public: | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|    void AddDrawItem(const std::shared_ptr<gl::draw::DrawItem>& drawItem); |    void AddDrawItem(const std::shared_ptr<gl::draw::DrawItem>& drawItem); | ||||||
|  |    void StartImGuiFrame(); | ||||||
|  |    void EndImGuiFrame(); | ||||||
|  |    void ImGuiInitialize(); | ||||||
|  |    void | ||||||
|  |    RenderWithoutImGui(const QMapLibre::CustomLayerRenderParameters& params); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|    std::unique_ptr<DrawLayerImpl> p; |    std::unique_ptr<DrawLayerImpl> p; | ||||||
|  |  | ||||||
|  | @ -36,6 +36,8 @@ public: | ||||||
| 
 | 
 | ||||||
|    std::shared_ptr<view::OverlayProductView> overlayProductView_ {nullptr}; |    std::shared_ptr<view::OverlayProductView> overlayProductView_ {nullptr}; | ||||||
|    std::shared_ptr<view::RadarProductView>   radarProductView_; |    std::shared_ptr<view::RadarProductView>   radarProductView_; | ||||||
|  | 
 | ||||||
|  |    QWidget* widget_; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| MapContext::MapContext( | MapContext::MapContext( | ||||||
|  | @ -109,6 +111,19 @@ int16_t MapContext::radar_product_code() const | ||||||
|    return p->radarProductCode_; |    return p->radarProductCode_; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | <<<<<<< HEAD | ||||||
|  | ======= | ||||||
|  | QMapLibre::CustomLayerRenderParameters MapContext::render_parameters() const | ||||||
|  | { | ||||||
|  |    return p->renderParameters_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | QWidget* MapContext::widget() const | ||||||
|  | { | ||||||
|  |    return p->widget_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | >>>>>>> 513a41d3 (Inital code for per map layer ImGui contexts) | ||||||
| void MapContext::set_map(const std::shared_ptr<QMapLibre::Map>& map) | void MapContext::set_map(const std::shared_ptr<QMapLibre::Map>& map) | ||||||
| { | { | ||||||
|    p->map_ = map; |    p->map_ = map; | ||||||
|  | @ -167,6 +182,11 @@ void MapContext::set_radar_product_code(int16_t radarProductCode) | ||||||
|    p->radarProductCode_ = radarProductCode; |    p->radarProductCode_ = radarProductCode; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void MapContext::set_widget(QWidget* widget) | ||||||
|  | { | ||||||
|  |    p->widget_ = widget; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace map
 | } // namespace map
 | ||||||
| } // namespace qt
 | } // namespace qt
 | ||||||
| } // namespace scwx
 | } // namespace scwx
 | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ public: | ||||||
|    common::RadarProductGroup                 radar_product_group() const; |    common::RadarProductGroup                 radar_product_group() const; | ||||||
|    std::string                               radar_product() const; |    std::string                               radar_product() const; | ||||||
|    int16_t                                   radar_product_code() const; |    int16_t                                   radar_product_code() const; | ||||||
|  |    QWidget*                                  widget() const; | ||||||
| 
 | 
 | ||||||
|    void set_map(const std::shared_ptr<QMapLibre::Map>& map); |    void set_map(const std::shared_ptr<QMapLibre::Map>& map); | ||||||
|    void set_map_copyrights(const std::string& copyrights); |    void set_map_copyrights(const std::string& copyrights); | ||||||
|  | @ -64,6 +65,7 @@ public: | ||||||
|    void set_radar_product_group(common::RadarProductGroup radarProductGroup); |    void set_radar_product_group(common::RadarProductGroup radarProductGroup); | ||||||
|    void set_radar_product(const std::string& radarProduct); |    void set_radar_product(const std::string& radarProduct); | ||||||
|    void set_radar_product_code(int16_t radarProductCode); |    void set_radar_product_code(int16_t radarProductCode); | ||||||
|  |    void set_widget(QWidget* widget); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|    class Impl; |    class Impl; | ||||||
|  |  | ||||||
|  | @ -114,6 +114,7 @@ public: | ||||||
|       context_->set_map_provider( |       context_->set_map_provider( | ||||||
|          GetMapProvider(generalSettings.map_provider().GetValue())); |          GetMapProvider(generalSettings.map_provider().GetValue())); | ||||||
|       context_->set_overlay_product_view(overlayProductView); |       context_->set_overlay_product_view(overlayProductView); | ||||||
|  |       context_->set_widget(widget); | ||||||
| 
 | 
 | ||||||
|       // Initialize map data
 |       // Initialize map data
 | ||||||
|       SetRadarSite(generalSettings.default_radar_site().GetValue()); |       SetRadarSite(generalSettings.default_radar_site().GetValue()); | ||||||
|  | @ -1571,21 +1572,10 @@ void MapWidget::paintGL() | ||||||
|    // Handle hotkey updates
 |    // Handle hotkey updates
 | ||||||
|    p->HandleHotkeyUpdates(); |    p->HandleHotkeyUpdates(); | ||||||
| 
 | 
 | ||||||
|    // Setup ImGui Frame
 |  | ||||||
|    ImGui::SetCurrentContext(p->imGuiContext_); |  | ||||||
| 
 |  | ||||||
|    // Lock ImGui font atlas prior to new ImGui frame
 |    // Lock ImGui font atlas prior to new ImGui frame
 | ||||||
|    std::shared_lock imguiFontAtlasLock { |    std::shared_lock imguiFontAtlasLock { | ||||||
|       manager::FontManager::Instance().imgui_font_atlas_mutex()}; |       manager::FontManager::Instance().imgui_font_atlas_mutex()}; | ||||||
| 
 | 
 | ||||||
|    // Start ImGui Frame
 |  | ||||||
|    ImGui_ImplQt_NewFrame(this); |  | ||||||
|    ImGui_ImplOpenGL3_NewFrame(); |  | ||||||
|    p->ImGuiCheckFonts(); |  | ||||||
|    ImGui::NewFrame(); |  | ||||||
| 
 |  | ||||||
|    // Set default font
 |  | ||||||
|    ImGui::PushFont(defaultFont->font()); |  | ||||||
| 
 | 
 | ||||||
|    // Update pixel ratio
 |    // Update pixel ratio
 | ||||||
|    p->context_->set_pixel_ratio(pixelRatio()); |    p->context_->set_pixel_ratio(pixelRatio()); | ||||||
|  | @ -1596,6 +1586,19 @@ void MapWidget::paintGL() | ||||||
|                                        size() * pixelRatio()); |                                        size() * pixelRatio()); | ||||||
|    p->map_->render(); |    p->map_->render(); | ||||||
| 
 | 
 | ||||||
|  |    // ImGui tool tip code
 | ||||||
|  |    // Setup ImGui Frame
 | ||||||
|  |    ImGui::SetCurrentContext(p->imGuiContext_); | ||||||
|  | 
 | ||||||
|  |    // Start ImGui Frame
 | ||||||
|  |    ImGui_ImplQt_NewFrame(this); | ||||||
|  |    ImGui_ImplOpenGL3_NewFrame(); | ||||||
|  |    p->ImGuiCheckFonts(); | ||||||
|  |    ImGui::NewFrame(); | ||||||
|  | 
 | ||||||
|  |    // Set default font
 | ||||||
|  |    ImGui::PushFont(defaultFont->font()); | ||||||
|  | 
 | ||||||
|    // Perform mouse picking
 |    // Perform mouse picking
 | ||||||
|    if (p->hasMouse_) |    if (p->hasMouse_) | ||||||
|    { |    { | ||||||
|  |  | ||||||
|  | @ -292,6 +292,8 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | ||||||
|    auto&                settings         = context()->settings(); |    auto&                settings         = context()->settings(); | ||||||
|    const float          pixelRatio       = context()->pixel_ratio(); |    const float          pixelRatio       = context()->pixel_ratio(); | ||||||
| 
 | 
 | ||||||
|  |    StartImGuiFrame(); | ||||||
|  | 
 | ||||||
|    p->sweepTimePicked_ = false; |    p->sweepTimePicked_ = false; | ||||||
| 
 | 
 | ||||||
|    if (radarProductView != nullptr) |    if (radarProductView != nullptr) | ||||||
|  | @ -457,7 +459,7 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | ||||||
|    p->icons_->SetIconVisible(p->mapLogoIcon_, |    p->icons_->SetIconVisible(p->mapLogoIcon_, | ||||||
|                              generalSettings.show_map_logo().GetValue()); |                              generalSettings.show_map_logo().GetValue()); | ||||||
| 
 | 
 | ||||||
|    DrawLayer::Render(params); |    DrawLayer::RenderWithoutImGui(params); | ||||||
| 
 | 
 | ||||||
|    auto mapCopyrights = context()->map_copyrights(); |    auto mapCopyrights = context()->map_copyrights(); | ||||||
|    if (mapCopyrights.length() > 0 && |    if (mapCopyrights.length() > 0 && | ||||||
|  | @ -491,6 +493,8 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | ||||||
|    p->lastFontSize_          = ImGui::GetFontSize(); |    p->lastFontSize_          = ImGui::GetFontSize(); | ||||||
|    p->lastColorTableMargins_ = colorTableMargins; |    p->lastColorTableMargins_ = colorTableMargins; | ||||||
| 
 | 
 | ||||||
|  |    EndImGuiFrame(); | ||||||
|  | 
 | ||||||
|    SCWX_GL_CHECK_ERROR(); |    SCWX_GL_CHECK_ERROR(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,6 +55,8 @@ void RadarSiteLayer::Initialize() | ||||||
|    logger_->debug("Initialize()"); |    logger_->debug("Initialize()"); | ||||||
| 
 | 
 | ||||||
|    p->radarSites_ = config::RadarSite::GetAll(); |    p->radarSites_ = config::RadarSite::GetAll(); | ||||||
|  | 
 | ||||||
|  |    ImGuiInitialize(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RadarSiteLayer::Render( | void RadarSiteLayer::Render( | ||||||
|  | @ -84,6 +86,7 @@ void RadarSiteLayer::Render( | ||||||
|    p->halfWidth_     = params.width * 0.5f; |    p->halfWidth_     = params.width * 0.5f; | ||||||
|    p->halfHeight_    = params.height * 0.5f; |    p->halfHeight_    = params.height * 0.5f; | ||||||
| 
 | 
 | ||||||
|  |    StartImGuiFrame(); | ||||||
|    // Radar site ImGui windows shouldn't have padding
 |    // Radar site ImGui windows shouldn't have padding
 | ||||||
|    ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2 {0.0f, 0.0f}); |    ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2 {0.0f, 0.0f}); | ||||||
| 
 | 
 | ||||||
|  | @ -93,6 +96,7 @@ void RadarSiteLayer::Render( | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    ImGui::PopStyleVar(); |    ImGui::PopStyleVar(); | ||||||
|  |    EndImGuiFrame(); | ||||||
| 
 | 
 | ||||||
|    SCWX_GL_CHECK_ERROR(); |    SCWX_GL_CHECK_ERROR(); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 AdenKoperczak
						AdenKoperczak