mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 01:40:04 +00:00 
			
		
		
		
	Render placefile Place statement
This commit is contained in:
		
							parent
							
								
									1c39464228
								
							
						
					
					
						commit
						9f5de14f6b
					
				
					 5 changed files with 148 additions and 29 deletions
				
			
		|  | @ -61,6 +61,24 @@ public: | ||||||
| PlacefileManager::PlacefileManager() : p(std::make_unique<Impl>(this)) {} | PlacefileManager::PlacefileManager() : p(std::make_unique<Impl>(this)) {} | ||||||
| PlacefileManager::~PlacefileManager() = default; | PlacefileManager::~PlacefileManager() = default; | ||||||
| 
 | 
 | ||||||
|  | std::vector<std::shared_ptr<gr::Placefile>> | ||||||
|  | PlacefileManager::GetActivePlacefiles() | ||||||
|  | { | ||||||
|  |    std::vector<std::shared_ptr<gr::Placefile>> placefiles; | ||||||
|  | 
 | ||||||
|  |    std::shared_lock lock {p->placefileRecordLock_}; | ||||||
|  | 
 | ||||||
|  |    for (const auto& record : p->placefileRecords_) | ||||||
|  |    { | ||||||
|  |       if (record->enabled_) | ||||||
|  |       { | ||||||
|  |          placefiles.emplace_back(record->placefile_); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    return placefiles; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void PlacefileManager::LoadFile(const std::string& filename) | void PlacefileManager::LoadFile(const std::string& filename) | ||||||
| { | { | ||||||
|    logger_->debug("LoadFile: {}", filename); |    logger_->debug("LoadFile: {}", filename); | ||||||
|  |  | ||||||
|  | @ -1,7 +1,6 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <memory> | #include <scwx/gr/placefile.hpp> | ||||||
| #include <string> |  | ||||||
| 
 | 
 | ||||||
| #include <QObject> | #include <QObject> | ||||||
| 
 | 
 | ||||||
|  | @ -20,6 +19,13 @@ public: | ||||||
|    explicit PlacefileManager(); |    explicit PlacefileManager(); | ||||||
|    ~PlacefileManager(); |    ~PlacefileManager(); | ||||||
| 
 | 
 | ||||||
|  |    /**
 | ||||||
|  |     * @brief Gets a list of active placefiles | ||||||
|  |     * | ||||||
|  |     * @return Vector of placefile pointers | ||||||
|  |     */ | ||||||
|  |    std::vector<std::shared_ptr<gr::Placefile>> GetActivePlacefiles(); | ||||||
|  | 
 | ||||||
|    void LoadFile(const std::string& filename); |    void LoadFile(const std::string& filename); | ||||||
| 
 | 
 | ||||||
|    static std::shared_ptr<PlacefileManager> Instance(); |    static std::shared_ptr<PlacefileManager> Instance(); | ||||||
|  |  | ||||||
|  | @ -1,8 +1,12 @@ | ||||||
| #include <scwx/qt/map/placefile_layer.hpp> | #include <scwx/qt/map/placefile_layer.hpp> | ||||||
|  | #include <scwx/qt/manager/placefile_manager.hpp> | ||||||
|  | #include <scwx/qt/util/geographic_lib.hpp> | ||||||
|  | #include <scwx/qt/util/maplibre.hpp> | ||||||
| #include <scwx/util/logger.hpp> | #include <scwx/util/logger.hpp> | ||||||
| 
 | 
 | ||||||
| #include <fmt/format.h> | #include <fmt/format.h> | ||||||
| #include <imgui.h> | #include <imgui.h> | ||||||
|  | #include <mbgl/util/constants.hpp> | ||||||
| 
 | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
|  | @ -20,13 +24,21 @@ public: | ||||||
|    explicit Impl(std::shared_ptr<MapContext> context) {}; |    explicit Impl(std::shared_ptr<MapContext> context) {}; | ||||||
|    ~Impl() = default; |    ~Impl() = default; | ||||||
| 
 | 
 | ||||||
|    void RenderText(const std::string&        text, |    void RenderPlace(const QMapLibreGL::CustomLayerRenderParameters& params, | ||||||
|  |                     std::shared_ptr<gr::Placefile::PlaceDrawItem>   place); | ||||||
|  | 
 | ||||||
|  |    void RenderText(const QMapLibreGL::CustomLayerRenderParameters& params, | ||||||
|  |                    const std::string&                              text, | ||||||
|                    const std::string&                              hoverText, |                    const std::string&                              hoverText, | ||||||
|                    boost::gil::rgba8_pixel_t                       color, |                    boost::gil::rgba8_pixel_t                       color, | ||||||
|                    float                                           x, |                    float                                           x, | ||||||
|                    float                                           y); |                    float                                           y); | ||||||
| 
 | 
 | ||||||
|    std::uint32_t textId_ {}; |    std::uint32_t textId_ {}; | ||||||
|  |    glm::vec2     mapScreenCoordLocation_ {}; | ||||||
|  |    float         mapScale_ {1.0f}; | ||||||
|  |    float         halfWidth_ {}; | ||||||
|  |    float         halfHeight_ {}; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| PlacefileLayer::PlacefileLayer(std::shared_ptr<MapContext> context) : | PlacefileLayer::PlacefileLayer(std::shared_ptr<MapContext> context) : | ||||||
|  | @ -43,7 +55,33 @@ void PlacefileLayer::Initialize() | ||||||
|    DrawLayer::Initialize(); |    DrawLayer::Initialize(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void PlacefileLayer::Impl::RenderText(const std::string&        text, | void PlacefileLayer::Impl::RenderPlace( | ||||||
|  |    const QMapLibreGL::CustomLayerRenderParameters& params, | ||||||
|  |    std::shared_ptr<gr::Placefile::PlaceDrawItem>   place) | ||||||
|  | { | ||||||
|  |    auto distance = util::GeographicLib::GetDistance( | ||||||
|  |       params.latitude, params.longitude, place->latitude_, place->longitude_); | ||||||
|  | 
 | ||||||
|  |    if (distance < place->threshold_) | ||||||
|  |    { | ||||||
|  |       const auto screenCoordinates = | ||||||
|  |          (util::maplibre::LatLongToScreenCoordinate( | ||||||
|  |              {place->latitude_, place->longitude_}) - | ||||||
|  |           mapScreenCoordLocation_) * | ||||||
|  |          mapScale_; | ||||||
|  | 
 | ||||||
|  |       RenderText(params, | ||||||
|  |                  place->text_, | ||||||
|  |                  "", | ||||||
|  |                  place->color_, | ||||||
|  |                  screenCoordinates.x + place->x_ + halfWidth_, | ||||||
|  |                  screenCoordinates.y + place->y_ + halfHeight_); | ||||||
|  |    } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void PlacefileLayer::Impl::RenderText( | ||||||
|  |    const QMapLibreGL::CustomLayerRenderParameters& params, | ||||||
|  |    const std::string&                              text, | ||||||
|    const std::string&                              hoverText, |    const std::string&                              hoverText, | ||||||
|    boost::gil::rgba8_pixel_t                       color, |    boost::gil::rgba8_pixel_t                       color, | ||||||
|    float                                           x, |    float                                           x, | ||||||
|  | @ -51,6 +89,9 @@ void PlacefileLayer::Impl::RenderText(const std::string&        text, | ||||||
| { | { | ||||||
|    const std::string windowName {fmt::format("PlacefileText-{}", ++textId_)}; |    const std::string windowName {fmt::format("PlacefileText-{}", ++textId_)}; | ||||||
| 
 | 
 | ||||||
|  |    // Convert screen to ImGui coordinates
 | ||||||
|  |    y = params.height - y; | ||||||
|  | 
 | ||||||
|    // Setup "window" to hold text
 |    // Setup "window" to hold text
 | ||||||
|    ImGui::SetNextWindowPos( |    ImGui::SetNextWindowPos( | ||||||
|       ImVec2 {x, y}, ImGuiCond_Always, ImVec2 {0.5f, 0.5f}); |       ImVec2 {x, y}, ImGuiCond_Always, ImVec2 {0.5f, 0.5f}); | ||||||
|  | @ -87,7 +128,33 @@ void PlacefileLayer::Render( | ||||||
|    // Reset text ID per frame
 |    // Reset text ID per frame
 | ||||||
|    p->textId_ = 0; |    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->halfWidth_  = params.width * 0.5f; | ||||||
|  |    p->halfHeight_ = params.height * 0.5f; | ||||||
|  | 
 | ||||||
|  |    std::shared_ptr<manager::PlacefileManager> placefileManager = | ||||||
|  |       manager::PlacefileManager::Instance(); | ||||||
|  | 
 | ||||||
|    // Render text
 |    // Render text
 | ||||||
|  |    for (auto& placefile : placefileManager->GetActivePlacefiles()) | ||||||
|  |    { | ||||||
|  |       for (auto& drawItem : placefile->GetDrawItems()) | ||||||
|  |       { | ||||||
|  |          switch (drawItem->itemType_) | ||||||
|  |          { | ||||||
|  |          case gr::Placefile::ItemType::Place: | ||||||
|  |             p->RenderPlace( | ||||||
|  |                params, | ||||||
|  |                std::static_pointer_cast<gr::Placefile::PlaceDrawItem>( | ||||||
|  |                   drawItem)); | ||||||
|  |             break; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
| 
 | 
 | ||||||
|    SCWX_GL_CHECK_ERROR(); |    SCWX_GL_CHECK_ERROR(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,6 +6,8 @@ | ||||||
| #include <vector> | #include <vector> | ||||||
| 
 | 
 | ||||||
| #include <boost/gil/typedefs.hpp> | #include <boost/gil/typedefs.hpp> | ||||||
|  | #include <boost/units/quantity.hpp> | ||||||
|  | #include <boost/units/systems/si/length.hpp> | ||||||
| 
 | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
|  | @ -33,8 +35,46 @@ public: | ||||||
|    Placefile(Placefile&&) noexcept; |    Placefile(Placefile&&) noexcept; | ||||||
|    Placefile& operator=(Placefile&&) noexcept; |    Placefile& operator=(Placefile&&) noexcept; | ||||||
| 
 | 
 | ||||||
|  |    enum class ItemType | ||||||
|  |    { | ||||||
|  |       Place, | ||||||
|  |       Icon, | ||||||
|  |       Font, | ||||||
|  |       Text, | ||||||
|  |       Line, | ||||||
|  |       Triangles, | ||||||
|  |       Image, | ||||||
|  |       Polygon, | ||||||
|  |       Unknown | ||||||
|  |    }; | ||||||
|  | 
 | ||||||
|  |    struct DrawItem | ||||||
|  |    { | ||||||
|  |       ItemType itemType_ {ItemType::Unknown}; | ||||||
|  |       boost::units::quantity<boost::units::si::length> threshold_ {}; | ||||||
|  |    }; | ||||||
|  | 
 | ||||||
|  |    struct PlaceDrawItem : DrawItem | ||||||
|  |    { | ||||||
|  |       PlaceDrawItem() { itemType_ = ItemType::Place; } | ||||||
|  | 
 | ||||||
|  |       boost::gil::rgba8_pixel_t color_ {}; | ||||||
|  |       double                    latitude_ {}; | ||||||
|  |       double                    longitude_ {}; | ||||||
|  |       double                    x_ {}; | ||||||
|  |       double                    y_ {}; | ||||||
|  |       std::string               text_ {}; | ||||||
|  |    }; | ||||||
|  | 
 | ||||||
|    bool IsValid() const; |    bool IsValid() const; | ||||||
| 
 | 
 | ||||||
|  |    /**
 | ||||||
|  |     * @brief Gets the list of draw items defined in the placefile | ||||||
|  |     * | ||||||
|  |     * @return vector of draw item pointers | ||||||
|  |     */ | ||||||
|  |    std::vector<std::shared_ptr<DrawItem>> GetDrawItems(); | ||||||
|  | 
 | ||||||
|    static std::shared_ptr<Placefile> Load(const std::string& filename); |    static std::shared_ptr<Placefile> Load(const std::string& filename); | ||||||
|    static std::shared_ptr<Placefile> Load(std::istream& is); |    static std::shared_ptr<Placefile> Load(std::istream& is); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -10,8 +10,6 @@ | ||||||
| 
 | 
 | ||||||
| #include <boost/algorithm/string.hpp> | #include <boost/algorithm/string.hpp> | ||||||
| #include <boost/units/base_units/metric/nautical_mile.hpp> | #include <boost/units/base_units/metric/nautical_mile.hpp> | ||||||
| #include <boost/units/quantity.hpp> |  | ||||||
| #include <boost/units/systems/si/length.hpp> |  | ||||||
| 
 | 
 | ||||||
| namespace scwx | namespace scwx | ||||||
| { | { | ||||||
|  | @ -42,21 +40,6 @@ public: | ||||||
|       double y_ {}; |       double y_ {}; | ||||||
|    }; |    }; | ||||||
| 
 | 
 | ||||||
|    struct DrawItem |  | ||||||
|    { |  | ||||||
|       boost::units::quantity<boost::units::si::length> threshold_ {}; |  | ||||||
|    }; |  | ||||||
| 
 |  | ||||||
|    struct PlaceDrawItem : DrawItem |  | ||||||
|    { |  | ||||||
|       boost::gil::rgba8_pixel_t color_ {}; |  | ||||||
|       double                    latitude_ {}; |  | ||||||
|       double                    longitude_ {}; |  | ||||||
|       double                    x_ {}; |  | ||||||
|       double                    y_ {}; |  | ||||||
|       std::string               text_ {}; |  | ||||||
|    }; |  | ||||||
| 
 |  | ||||||
|    void ParseLocation(const std::string& latitudeToken, |    void ParseLocation(const std::string& latitudeToken, | ||||||
|                       const std::string& longitudeToken, |                       const std::string& longitudeToken, | ||||||
|                       double&            latitude, |                       double&            latitude, | ||||||
|  | @ -93,6 +76,11 @@ bool Placefile::IsValid() const | ||||||
|    return p->drawItems_.size() > 0; |    return p->drawItems_.size() > 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | std::vector<std::shared_ptr<Placefile::DrawItem>> Placefile::GetDrawItems() | ||||||
|  | { | ||||||
|  |    return p->drawItems_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| std::shared_ptr<Placefile> Placefile::Load(const std::string& filename) | std::shared_ptr<Placefile> Placefile::Load(const std::string& filename) | ||||||
| { | { | ||||||
|    logger_->debug("Loading placefile: {}", filename); |    logger_->debug("Loading placefile: {}", filename); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat