diff --git a/scwx-qt/source/scwx/qt/gl/draw/linked_vectors.cpp b/scwx-qt/source/scwx/qt/gl/draw/linked_vectors.cpp index 2d59b524..a457a1c4 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/linked_vectors.cpp +++ b/scwx-qt/source/scwx/qt/gl/draw/linked_vectors.cpp @@ -50,6 +50,10 @@ struct LinkedVectorDrawItem float width_ {5.0f}; bool visible_ {true}; std::string hoverText_ {}; + + bool ticksEnabled_ {false}; + units::length::nautical_miles tickRadius_ {1.0}; + units::length::nautical_miles tickRadiusIncrement_ {0.0}; }; class LinkedVectors::Impl @@ -69,10 +73,6 @@ public: std::vector> vectorList_ {}; std::shared_ptr geoLines_; - - bool ticksEnabled_ {false}; - units::length::nautical_miles tickRadius_ {1.0}; - units::length::nautical_miles tickRadiusIncrement_ {1.0}; }; LinkedVectors::LinkedVectors(std::shared_ptr context) : @@ -176,6 +176,26 @@ void LinkedVectors::SetVectorHoverText( di->hoverText_ = text; } +void LinkedVectors::SetVectorTicksEnabled( + const std::shared_ptr& di, bool enabled) +{ + di->ticksEnabled_ = enabled; +} + +void LinkedVectors::SetVectorTickRadius( + const std::shared_ptr& di, + units::length::meters radius) +{ + di->tickRadius_ = radius; +} + +void LinkedVectors::SetVectorTickRadiusIncrement( + const std::shared_ptr& di, + units::length::meters radiusIncrement) +{ + di->tickRadiusIncrement_ = radiusIncrement; +} + void LinkedVectors::FinishVectors() { // Generate borders @@ -183,7 +203,7 @@ void LinkedVectors::FinishVectors() { for (auto& di : p->vectorList_) { - auto tickRadius = p->tickRadius_; + auto tickRadius = di->tickRadius_; for (std::size_t i = 0; i < di->coordinates_.size() - 1; ++i) { @@ -207,7 +227,7 @@ void LinkedVectors::FinishVectors() di->borderDrawItems_.emplace_back(std::move(borderLine)); - if (p->ticksEnabled_) + if (di->ticksEnabled_) { auto angle = util::GeographicLib::GetAngle( latitude1, longitude1, latitude2, longitude2); @@ -234,7 +254,7 @@ void LinkedVectors::FinishVectors() GeoLines::SetLineVisible(tickBorderLine, di->visible_); GeoLines::SetLineHoverText(tickBorderLine, di->hoverText_); - tickRadius += p->tickRadiusIncrement_; + tickRadius += di->tickRadiusIncrement_; } } } @@ -243,7 +263,7 @@ void LinkedVectors::FinishVectors() // Generate geo lines for (auto& di : p->vectorList_) { - auto tickRadius = p->tickRadius_; + auto tickRadius = di->tickRadius_; for (std::size_t i = 0; i < di->coordinates_.size() - 1; ++i) { @@ -272,7 +292,7 @@ void LinkedVectors::FinishVectors() di->lineDrawItems_.emplace_back(std::move(geoLine)); - if (p->ticksEnabled_) + if (di->ticksEnabled_) { auto angle = util::GeographicLib::GetAngle( latitude1, longitude1, latitude2, longitude2); @@ -304,7 +324,7 @@ void LinkedVectors::FinishVectors() GeoLines::SetLineHoverText(tickGeoLine, di->hoverText_); } - tickRadius += p->tickRadiusIncrement_; + tickRadius += di->tickRadiusIncrement_; } } } diff --git a/scwx-qt/source/scwx/qt/gl/draw/linked_vectors.hpp b/scwx-qt/source/scwx/qt/gl/draw/linked_vectors.hpp index 2dd9c898..564e3853 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/linked_vectors.hpp +++ b/scwx-qt/source/scwx/qt/gl/draw/linked_vectors.hpp @@ -4,6 +4,7 @@ #include #include +#include namespace scwx { @@ -131,6 +132,36 @@ public: SetVectorHoverText(const std::shared_ptr& di, const std::string& text); + /** + * Sets the presence of ticks on the linked vector. + * + * @param [in] di Linked vector draw item + * @param [in] enabled Ticks enabled + */ + static void + SetVectorTicksEnabled(const std::shared_ptr& di, + bool enabled); + + /** + * Sets the tick radius of the linked vector. + * + * @param [in] di Linked vector draw item + * @param [in] radius Length of the tick extending beyond the linked vector + */ + static void + SetVectorTickRadius(const std::shared_ptr& di, + units::length::meters radius); + + /** + * Sets the tick radius increment of the linked vector. + * + * @param [in] di Linked vector draw item + * @param [in] radiusIncrement Length increment of each tick beyond the first + */ + static void + SetVectorTickRadiusIncrement(const std::shared_ptr& di, + units::length::meters radiusIncrement); + /** * Finalizes the draw item after adding new linked vectors. */ diff --git a/scwx-qt/source/scwx/qt/map/overlay_product_layer.cpp b/scwx-qt/source/scwx/qt/map/overlay_product_layer.cpp index e8ff43e9..42068b36 100644 --- a/scwx-qt/source/scwx/qt/map/overlay_product_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/overlay_product_layer.cpp @@ -37,6 +37,7 @@ public: const common::Coordinate& center, const std::string& hoverText, boost::gil::rgba32f_pixel_t color, + bool tickRadiusIncrement, std::shared_ptr& linkedVectors); static void HandleScitDataPacket( const std::shared_ptr& packet, @@ -220,10 +221,12 @@ void OverlayProductLayer::Impl::HandleScitDataPacket( if (scitDataPacket != nullptr) { boost::gil::rgba32f_pixel_t color {1.0f, 1.0f, 1.0f, 1.0f}; + bool tickRadiusIncrement = true; if (scitDataPacket->packet_code() == static_cast(wsr88d::rpg::PacketCode::ScitPastData)) { - color = {0.5f, 0.5f, 0.5f, 1.0f}; + color = {0.5f, 0.5f, 0.5f, 1.0f}; + tickRadiusIncrement = false; } for (auto& subpacket : scitDataPacket->packet_list()) @@ -232,8 +235,12 @@ void OverlayProductLayer::Impl::HandleScitDataPacket( { case static_cast( wsr88d::rpg::PacketCode::LinkedVectorNoValue): - HandleLinkedVectorPacket( - subpacket, center, stormId, color, linkedVectors); + HandleLinkedVectorPacket(subpacket, + center, + stormId, + color, + tickRadiusIncrement, + linkedVectors); break; default: @@ -254,6 +261,7 @@ void OverlayProductLayer::Impl::HandleLinkedVectorPacket( const common::Coordinate& center, const std::string& hoverText, boost::gil::rgba32f_pixel_t color, + bool tickRadiusIncrement, std::shared_ptr& linkedVectors) { auto linkedVectorPacket = @@ -265,6 +273,20 @@ void OverlayProductLayer::Impl::HandleLinkedVectorPacket( gl::draw::LinkedVectors::SetVectorWidth(di, 1.0f); gl::draw::LinkedVectors::SetVectorModulate(di, color); gl::draw::LinkedVectors::SetVectorHoverText(di, hoverText); + gl::draw::LinkedVectors::SetVectorTicksEnabled(di, true); + gl::draw::LinkedVectors::SetVectorTickRadius( + di, units::length::nautical_miles {1.0}); + + if (tickRadiusIncrement) + { + gl::draw::LinkedVectors::SetVectorTickRadiusIncrement( + di, units::length::nautical_miles {1.0}); + } + else + { + gl::draw::LinkedVectors::SetVectorTickRadiusIncrement( + di, units::length::nautical_miles {0.0}); + } } else {