mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 04:40: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/model/imgui_context_model.hpp> | ||||
| #include <scwx/qt/gl/shader_program.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 qt | ||||
|  | @ -16,18 +23,65 @@ class DrawLayerImpl | |||
| { | ||||
| public: | ||||
|    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::vector<std::shared_ptr<gl::draw::DrawItem>> drawList_; | ||||
|    GLuint                                           textureAtlas_; | ||||
| 
 | ||||
|    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) : | ||||
|     GenericLayer(context), p(std::make_unique<DrawLayerImpl>(context)) | ||||
| { | ||||
|  | @ -42,9 +96,48 @@ void DrawLayer::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(); | ||||
|    p->textureAtlas_        = p->context_->GetTextureAtlas(); | ||||
|  | @ -69,6 +162,13 @@ void DrawLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
|    p->textureAtlasBuildCount_ = newTextureAtlasBuildCount; | ||||
| } | ||||
| 
 | ||||
|    void DrawLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | ||||
| { | ||||
|    StartImGuiFrame(); | ||||
|    RenderWithoutImGui(params); | ||||
|    EndImGuiFrame(); | ||||
| } | ||||
| 
 | ||||
| void DrawLayer::Deinitialize() | ||||
| { | ||||
|    p->textureAtlas_ = GL_INVALID_INDEX; | ||||
|  |  | |||
|  | @ -32,6 +32,11 @@ public: | |||
| 
 | ||||
| protected: | ||||
|    void AddDrawItem(const std::shared_ptr<gl::draw::DrawItem>& drawItem); | ||||
|    void StartImGuiFrame(); | ||||
|    void EndImGuiFrame(); | ||||
|    void ImGuiInitialize(); | ||||
|    void | ||||
|    RenderWithoutImGui(const QMapLibre::CustomLayerRenderParameters& params); | ||||
| 
 | ||||
| private: | ||||
|    std::unique_ptr<DrawLayerImpl> p; | ||||
|  |  | |||
|  | @ -36,6 +36,8 @@ public: | |||
| 
 | ||||
|    std::shared_ptr<view::OverlayProductView> overlayProductView_ {nullptr}; | ||||
|    std::shared_ptr<view::RadarProductView>   radarProductView_; | ||||
| 
 | ||||
|    QWidget* widget_; | ||||
| }; | ||||
| 
 | ||||
| MapContext::MapContext( | ||||
|  | @ -109,6 +111,19 @@ int16_t MapContext::radar_product_code() const | |||
|    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) | ||||
| { | ||||
|    p->map_ = map; | ||||
|  | @ -167,6 +182,11 @@ void MapContext::set_radar_product_code(int16_t radarProductCode) | |||
|    p->radarProductCode_ = radarProductCode; | ||||
| } | ||||
| 
 | ||||
| void MapContext::set_widget(QWidget* widget) | ||||
| { | ||||
|    p->widget_ = widget; | ||||
| } | ||||
| 
 | ||||
| } // namespace map
 | ||||
| } // namespace qt
 | ||||
| } // namespace scwx
 | ||||
|  |  | |||
|  | @ -50,6 +50,7 @@ public: | |||
|    common::RadarProductGroup                 radar_product_group() const; | ||||
|    std::string                               radar_product() const; | ||||
|    int16_t                                   radar_product_code() const; | ||||
|    QWidget*                                  widget() const; | ||||
| 
 | ||||
|    void set_map(const std::shared_ptr<QMapLibre::Map>& map); | ||||
|    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(const std::string& radarProduct); | ||||
|    void set_radar_product_code(int16_t radarProductCode); | ||||
|    void set_widget(QWidget* widget); | ||||
| 
 | ||||
| private: | ||||
|    class Impl; | ||||
|  |  | |||
|  | @ -114,6 +114,7 @@ public: | |||
|       context_->set_map_provider( | ||||
|          GetMapProvider(generalSettings.map_provider().GetValue())); | ||||
|       context_->set_overlay_product_view(overlayProductView); | ||||
|       context_->set_widget(widget); | ||||
| 
 | ||||
|       // Initialize map data
 | ||||
|       SetRadarSite(generalSettings.default_radar_site().GetValue()); | ||||
|  | @ -1571,21 +1572,10 @@ void MapWidget::paintGL() | |||
|    // Handle hotkey updates
 | ||||
|    p->HandleHotkeyUpdates(); | ||||
| 
 | ||||
|    // Setup ImGui Frame
 | ||||
|    ImGui::SetCurrentContext(p->imGuiContext_); | ||||
| 
 | ||||
|    // Lock ImGui font atlas prior to new ImGui frame
 | ||||
|    std::shared_lock imguiFontAtlasLock { | ||||
|       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
 | ||||
|    p->context_->set_pixel_ratio(pixelRatio()); | ||||
|  | @ -1596,6 +1586,19 @@ void MapWidget::paintGL() | |||
|                                        size() * pixelRatio()); | ||||
|    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
 | ||||
|    if (p->hasMouse_) | ||||
|    { | ||||
|  |  | |||
|  | @ -292,6 +292,8 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
|    auto&                settings         = context()->settings(); | ||||
|    const float          pixelRatio       = context()->pixel_ratio(); | ||||
| 
 | ||||
|    StartImGuiFrame(); | ||||
| 
 | ||||
|    p->sweepTimePicked_ = false; | ||||
| 
 | ||||
|    if (radarProductView != nullptr) | ||||
|  | @ -457,7 +459,7 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
|    p->icons_->SetIconVisible(p->mapLogoIcon_, | ||||
|                              generalSettings.show_map_logo().GetValue()); | ||||
| 
 | ||||
|    DrawLayer::Render(params); | ||||
|    DrawLayer::RenderWithoutImGui(params); | ||||
| 
 | ||||
|    auto mapCopyrights = context()->map_copyrights(); | ||||
|    if (mapCopyrights.length() > 0 && | ||||
|  | @ -491,6 +493,8 @@ void OverlayLayer::Render(const QMapLibre::CustomLayerRenderParameters& params) | |||
|    p->lastFontSize_          = ImGui::GetFontSize(); | ||||
|    p->lastColorTableMargins_ = colorTableMargins; | ||||
| 
 | ||||
|    EndImGuiFrame(); | ||||
| 
 | ||||
|    SCWX_GL_CHECK_ERROR(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -55,6 +55,8 @@ void RadarSiteLayer::Initialize() | |||
|    logger_->debug("Initialize()"); | ||||
| 
 | ||||
|    p->radarSites_ = config::RadarSite::GetAll(); | ||||
| 
 | ||||
|    ImGuiInitialize(); | ||||
| } | ||||
| 
 | ||||
| void RadarSiteLayer::Render( | ||||
|  | @ -84,6 +86,7 @@ void RadarSiteLayer::Render( | |||
|    p->halfWidth_     = params.width * 0.5f; | ||||
|    p->halfHeight_    = params.height * 0.5f; | ||||
| 
 | ||||
|    StartImGuiFrame(); | ||||
|    // Radar site ImGui windows shouldn't have padding
 | ||||
|    ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2 {0.0f, 0.0f}); | ||||
| 
 | ||||
|  | @ -93,6 +96,7 @@ void RadarSiteLayer::Render( | |||
|    } | ||||
| 
 | ||||
|    ImGui::PopStyleVar(); | ||||
|    EndImGuiFrame(); | ||||
| 
 | ||||
|    SCWX_GL_CHECK_ERROR(); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 AdenKoperczak
						AdenKoperczak