[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,
std::vector<uint32_t> const & toRemove)
{
bool wasChanged = false;
bool recreateSpline = false;
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);
};
m_points.erase(std::remove_if(m_points.begin(), m_points.end(), removePredicate),
m_points.end());
wasChanged = true;
});
if (szBefore > m_points.size()) // if removed any
{
recreateSpline = true;
m_needUpdate = true;
}
}
if (!toAdd.empty())
@@ -104,17 +108,20 @@ void GpsTrackRenderer::UpdatePoints(std::vector<GpsTrackPoint> const & toAdd,
ASSERT(is_sorted(toAdd.begin(), toAdd.end(), GpsPointsSortPredicate), ());
ASSERT(m_points.empty() || GpsPointsSortPredicate(m_points.back(), toAdd.front()), ());
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());
for (size_t i = 0; i < m_points.size(); i++)
m_pointsSpline.AddPoint(m_points[i].m_point);
for (auto const & p : m_points)
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
@@ -315,6 +322,8 @@ void GpsTrackRenderer::Update()
void GpsTrackRenderer::Clear()
{
m_points.clear();
m_pointsSpline.Clear();
ClearRenderData();
}
} // namespace df