mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 02:40:05 +00:00 
			
		
		
		
	Refactor placefile text into its own draw item
This commit is contained in:
		
							parent
							
								
									d6f8a339fc
								
							
						
					
					
						commit
						a4027ba120
					
				
					 4 changed files with 321 additions and 132 deletions
				
			
		|  | @ -1,16 +1,10 @@ | |||
| #include <scwx/qt/map/placefile_layer.hpp> | ||||
| #include <scwx/qt/gl/draw/placefile_icons.hpp> | ||||
| #include <scwx/qt/gl/draw/placefile_polygons.hpp> | ||||
| #include <scwx/qt/gl/draw/placefile_text.hpp> | ||||
| #include <scwx/qt/manager/placefile_manager.hpp> | ||||
| #include <scwx/qt/manager/resource_manager.hpp> | ||||
| #include <scwx/qt/manager/settings_manager.hpp> | ||||
| #include <scwx/qt/util/maplibre.hpp> | ||||
| #include <scwx/common/geographic.hpp> | ||||
| #include <scwx/util/logger.hpp> | ||||
| 
 | ||||
| #include <fmt/format.h> | ||||
| #include <imgui.h> | ||||
| #include <mbgl/util/constants.hpp> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
|  | @ -32,7 +26,9 @@ public: | |||
|        placefileName_ {placefileName}, | ||||
|        placefileIcons_ {std::make_shared<gl::draw::PlacefileIcons>(context)}, | ||||
|        placefilePolygons_ { | ||||
|           std::make_shared<gl::draw::PlacefilePolygons>(context)} | ||||
|           std::make_shared<gl::draw::PlacefilePolygons>(context)}, | ||||
|        placefileText_ { | ||||
|           std::make_shared<gl::draw::PlacefileText>(context, placefileName)} | ||||
|    { | ||||
|       ConnectSignals(); | ||||
|    } | ||||
|  | @ -42,36 +38,17 @@ public: | |||
| 
 | ||||
|    void AddIcon(const std::shared_ptr<gr::Placefile::IconDrawItem>& di); | ||||
|    void AddPolygon(const std::shared_ptr<gr::Placefile::PolygonDrawItem>& di); | ||||
|    void | ||||
|    RenderTextDrawItem(const QMapLibreGL::CustomLayerRenderParameters& params, | ||||
|                       const std::shared_ptr<gr::Placefile::TextDrawItem>& di); | ||||
|    void AddText(const std::shared_ptr<gr::Placefile::TextDrawItem>& di); | ||||
| 
 | ||||
|    void RenderText(const QMapLibreGL::CustomLayerRenderParameters& params, | ||||
|                    const std::string&                              text, | ||||
|                    const std::string&                              hoverText, | ||||
|                    boost::gil::rgba8_pixel_t                       color, | ||||
|                    float                                           x, | ||||
|                    float                                           y); | ||||
| 
 | ||||
|    PlacefileLayer* self_; | ||||
| 
 | ||||
|    std::string placefileName_; | ||||
|    bool        dirty_ {true}; | ||||
| 
 | ||||
|    std::uint32_t textId_ {}; | ||||
|    glm::vec2     mapScreenCoordLocation_ {}; | ||||
|    float         mapScale_ {1.0f}; | ||||
|    float         mapBearingCos_ {1.0f}; | ||||
|    float         mapBearingSin_ {0.0f}; | ||||
|    float         halfWidth_ {}; | ||||
|    float         halfHeight_ {}; | ||||
|    bool          thresholded_ {true}; | ||||
|    ImFont*       monospaceFont_ {}; | ||||
| 
 | ||||
|    units::length::nautical_miles<double> mapDistance_ {}; | ||||
| 
 | ||||
|    std::shared_ptr<gl::draw::PlacefileIcons>    placefileIcons_; | ||||
|    std::shared_ptr<gl::draw::PlacefilePolygons> placefilePolygons_; | ||||
|    std::shared_ptr<gl::draw::PlacefileText>     placefileText_; | ||||
| }; | ||||
| 
 | ||||
| PlacefileLayer::PlacefileLayer(std::shared_ptr<MapContext> context, | ||||
|  | @ -81,6 +58,7 @@ PlacefileLayer::PlacefileLayer(std::shared_ptr<MapContext> context, | |||
| { | ||||
|    AddDrawItem(p->placefileIcons_); | ||||
|    AddDrawItem(p->placefilePolygons_); | ||||
|    AddDrawItem(p->placefileText_); | ||||
| } | ||||
| 
 | ||||
| PlacefileLayer::~PlacefileLayer() = default; | ||||
|  | @ -110,6 +88,8 @@ void PlacefileLayer::set_placefile_name(const std::string& placefileName) | |||
| { | ||||
|    p->placefileName_ = placefileName; | ||||
|    p->dirty_         = true; | ||||
| 
 | ||||
|    p->placefileText_->set_placefile_name(placefileName); | ||||
| } | ||||
| 
 | ||||
| void PlacefileLayer::Initialize() | ||||
|  | @ -141,78 +121,15 @@ void PlacefileLayer::Impl::AddPolygon( | |||
|    placefilePolygons_->AddPolygon(di); | ||||
| } | ||||
| 
 | ||||
| void PlacefileLayer::Impl::RenderTextDrawItem( | ||||
|    const QMapLibreGL::CustomLayerRenderParameters&     params, | ||||
| void PlacefileLayer::Impl::AddText( | ||||
|    const std::shared_ptr<gr::Placefile::TextDrawItem>& di) | ||||
| { | ||||
|    if (!thresholded_ || mapDistance_ <= di->threshold_) | ||||
|    if (!dirty_) | ||||
|    { | ||||
|       const auto screenCoordinates = (util::maplibre::LatLongToScreenCoordinate( | ||||
|                                          {di->latitude_, di->longitude_}) - | ||||
|                                       mapScreenCoordLocation_) * | ||||
|                                      mapScale_; | ||||
|       return; | ||||
|    }; | ||||
| 
 | ||||
|       // Rotate text according to map rotation
 | ||||
|       float rotatedX = screenCoordinates.x; | ||||
|       float rotatedY = screenCoordinates.y; | ||||
|       if (params.bearing != 0.0) | ||||
|       { | ||||
|          rotatedX = screenCoordinates.x * mapBearingCos_ - | ||||
|                     screenCoordinates.y * mapBearingSin_; | ||||
|          rotatedY = screenCoordinates.x * mapBearingSin_ + | ||||
|                     screenCoordinates.y * mapBearingCos_; | ||||
|       } | ||||
| 
 | ||||
|       RenderText(params, | ||||
|                  di->text_, | ||||
|                  di->hoverText_, | ||||
|                  di->color_, | ||||
|                  rotatedX + di->x_ + halfWidth_, | ||||
|                  rotatedY + di->y_ + halfHeight_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void PlacefileLayer::Impl::RenderText( | ||||
|    const QMapLibreGL::CustomLayerRenderParameters& params, | ||||
|    const std::string&                              text, | ||||
|    const std::string&                              hoverText, | ||||
|    boost::gil::rgba8_pixel_t                       color, | ||||
|    float                                           x, | ||||
|    float                                           y) | ||||
| { | ||||
|    const std::string windowName { | ||||
|       fmt::format("PlacefileText-{}-{}", placefileName_, ++textId_)}; | ||||
| 
 | ||||
|    // Convert screen to ImGui coordinates
 | ||||
|    y = params.height - y; | ||||
| 
 | ||||
|    // Setup "window" to hold text
 | ||||
|    ImGui::SetNextWindowPos( | ||||
|       ImVec2 {x, y}, ImGuiCond_Always, ImVec2 {0.5f, 0.5f}); | ||||
|    ImGui::Begin(windowName.c_str(), | ||||
|                 nullptr, | ||||
|                 ImGuiWindowFlags_AlwaysAutoResize | | ||||
|                    ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoNav | | ||||
|                    ImGuiWindowFlags_NoBackground); | ||||
| 
 | ||||
|    // Render text
 | ||||
|    ImGui::PushStyleColor(ImGuiCol_Text, | ||||
|                          IM_COL32(color[0], color[1], color[2], color[3])); | ||||
|    ImGui::TextUnformatted(text.c_str()); | ||||
|    ImGui::PopStyleColor(); | ||||
| 
 | ||||
|    // Create tooltip for hover text
 | ||||
|    if (!hoverText.empty() && ImGui::IsItemHovered()) | ||||
|    { | ||||
|       ImGui::BeginTooltip(); | ||||
|       ImGui::PushFont(monospaceFont_); | ||||
|       ImGui::TextUnformatted(hoverText.c_str()); | ||||
|       ImGui::PopFont(); | ||||
|       ImGui::EndTooltip(); | ||||
|    } | ||||
| 
 | ||||
|    // End window
 | ||||
|    ImGui::End(); | ||||
|    placefileText_->AddText(di); | ||||
| } | ||||
| 
 | ||||
| void PlacefileLayer::Render( | ||||
|  | @ -223,36 +140,6 @@ void PlacefileLayer::Render( | |||
|    // Set OpenGL blend mode for transparency
 | ||||
|    gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
| 
 | ||||
|    // Reset text ID per frame
 | ||||
|    p->textId_ = 0; | ||||
| 
 | ||||
|    // Update map screen coordinate and scale information
 | ||||
|    p->mapScreenCoordLocation_ = util::maplibre::LatLongToScreenCoordinate( | ||||
|       {params.latitude, params.longitude}); | ||||
|    p->mapScale_ = std::pow(2.0, params.zoom) * mbgl::util::tileSize_D / | ||||
|                   mbgl::util::DEGREES_MAX; | ||||
|    p->mapBearingCos_ = cosf(params.bearing * common::kDegreesToRadians); | ||||
|    p->mapBearingSin_ = sinf(params.bearing * common::kDegreesToRadians); | ||||
|    p->halfWidth_     = params.width * 0.5f; | ||||
|    p->halfHeight_    = params.height * 0.5f; | ||||
|    p->mapDistance_   = util::maplibre::GetMapDistance(params); | ||||
| 
 | ||||
|    // Get monospace font pointer
 | ||||
|    std::size_t fontSize = 16; | ||||
|    auto        fontSizes = | ||||
|       manager::SettingsManager::general_settings().font_sizes().GetValue(); | ||||
|    if (fontSizes.size() > 1) | ||||
|    { | ||||
|       fontSize = fontSizes[1]; | ||||
|    } | ||||
|    else if (fontSizes.size() > 0) | ||||
|    { | ||||
|       fontSize = fontSizes[0]; | ||||
|    } | ||||
|    auto monospace = | ||||
|       manager::ResourceManager::Font(types::Font::Inconsolata_Regular); | ||||
|    p->monospaceFont_ = monospace->ImGuiFont(fontSize); | ||||
| 
 | ||||
|    std::shared_ptr<manager::PlacefileManager> placefileManager = | ||||
|       manager::PlacefileManager::Instance(); | ||||
| 
 | ||||
|  | @ -261,10 +148,11 @@ void PlacefileLayer::Render( | |||
|    // Render placefile
 | ||||
|    if (placefile != nullptr) | ||||
|    { | ||||
|       p->thresholded_ = | ||||
|       bool thresholded = | ||||
|          placefileManager->placefile_thresholded(placefile->name()); | ||||
|       p->placefileIcons_->set_thresholded(p->thresholded_); | ||||
|       p->placefilePolygons_->set_thresholded(p->thresholded_); | ||||
|       p->placefileIcons_->set_thresholded(thresholded); | ||||
|       p->placefilePolygons_->set_thresholded(thresholded); | ||||
|       p->placefileText_->set_thresholded(thresholded); | ||||
| 
 | ||||
|       if (p->dirty_) | ||||
|       { | ||||
|  | @ -275,6 +163,9 @@ void PlacefileLayer::Render( | |||
| 
 | ||||
|          // Reset Placefile Polygons
 | ||||
|          p->placefilePolygons_->StartPolygons(); | ||||
| 
 | ||||
|          // Reset Placefile Text
 | ||||
|          p->placefileText_->Reset(); | ||||
|       } | ||||
| 
 | ||||
|       for (auto& drawItem : placefile->GetDrawItems()) | ||||
|  | @ -282,8 +173,7 @@ void PlacefileLayer::Render( | |||
|          switch (drawItem->itemType_) | ||||
|          { | ||||
|          case gr::Placefile::ItemType::Text: | ||||
|             p->RenderTextDrawItem( | ||||
|                params, | ||||
|             p->AddText( | ||||
|                std::static_pointer_cast<gr::Placefile::TextDrawItem>(drawItem)); | ||||
|             break; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat