[drape] Relaxed GPS track Spline update.

Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
This commit is contained in:
Viktor Govako
2025-06-16 15:26:28 -03:00
committed by Konstantin Pastbin
parent 4bf61f14f8
commit 01388ae6dd

View File

@@ -87,16 +87,20 @@ void GpsTrackRenderer::ClearRenderData()
void GpsTrackRenderer::UpdatePoints(std::vector<GpsTrackPoint> const & toAdd, void GpsTrackRenderer::UpdatePoints(std::vector<GpsTrackPoint> const & toAdd,
std::vector<uint32_t> const & toRemove) std::vector<uint32_t> const & toRemove)
{ {
bool wasChanged = false; bool recreateSpline = false;
if (!toRemove.empty()) if (!toRemove.empty())
{ {
auto removePredicate = [&toRemove](GpsTrackPoint const & pt) size_t const szBefore = m_points.size();
base::EraseIf(m_points, [&toRemove](GpsTrackPoint const & pt)
{ {
return base::IsExist(toRemove, pt.m_id); return base::IsExist(toRemove, pt.m_id);
}; });
m_points.erase(std::remove_if(m_points.begin(), m_points.end(), removePredicate),
m_points.end()); if (szBefore > m_points.size()) // if removed any
wasChanged = true; {
recreateSpline = true;
m_needUpdate = true;
}
} }
if (!toAdd.empty()) if (!toAdd.empty())
@@ -104,17 +108,20 @@ void GpsTrackRenderer::UpdatePoints(std::vector<GpsTrackPoint> const & toAdd,
ASSERT(is_sorted(toAdd.begin(), toAdd.end(), GpsPointsSortPredicate), ()); ASSERT(is_sorted(toAdd.begin(), toAdd.end(), GpsPointsSortPredicate), ());
ASSERT(m_points.empty() || GpsPointsSortPredicate(m_points.back(), toAdd.front()), ()); ASSERT(m_points.empty() || GpsPointsSortPredicate(m_points.back(), toAdd.front()), ());
m_points.insert(m_points.end(), toAdd.begin(), toAdd.end()); m_points.insert(m_points.end(), toAdd.begin(), toAdd.end());
wasChanged = true; m_needUpdate = true;
} }
if (wasChanged) if (recreateSpline) // Recreate Spline only if Remove (Clear) was invoked.
{ {
m_pointsSpline = m2::Spline(m_points.size()); m_pointsSpline = m2::Spline(m_points.size());
for (size_t i = 0; i < m_points.size(); i++) for (auto const & p : m_points)
m_pointsSpline.AddPoint(m_points[i].m_point); m_pointsSpline.AddPoint(p.m_point);
}
else // Simple append points otherwise.
{
for (auto const & p : toAdd)
m_pointsSpline.AddPoint(p.m_point);
} }
m_needUpdate = wasChanged;
} }
size_t GpsTrackRenderer::GetAvailablePointsCount() const size_t GpsTrackRenderer::GetAvailablePointsCount() const
@@ -315,6 +322,8 @@ void GpsTrackRenderer::Update()
void GpsTrackRenderer::Clear() void GpsTrackRenderer::Clear()
{ {
m_points.clear(); m_points.clear();
m_pointsSpline.Clear();
ClearRenderData(); ClearRenderData();
} }
} // namespace df } // namespace df