| 307 | } |
| 308 | |
| 309 | void RouteRenderer::UpdatePreview(ScreenBase const & screen) |
| 310 | { |
| 311 | // Check if there are preview render data. |
| 312 | if (m_previewRenderData.empty() && !m_waitForPreviewRenderData) |
| 313 | { |
| 314 | m_previewPointsRequest(kPreviewPointsCount); |
| 315 | m_waitForPreviewRenderData = true; |
| 316 | } |
| 317 | if (m_waitForPreviewRenderData) |
| 318 | return; |
| 319 | |
| 320 | float previewCircleRadius = 0.0; |
| 321 | if (!m_previewSegments.empty()) |
| 322 | { |
| 323 | ClearPreviewHandles(); |
| 324 | m_previewPivot = screen.GlobalRect().Center(); |
| 325 | previewCircleRadius = CalculateRadius(screen, kPreviewPointRadiusInPixel); |
| 326 | } |
| 327 | double const currentScaleGtoP = 1.0 / screen.GetScale(); |
| 328 | double const radiusMercator = previewCircleRadius / currentScaleGtoP; |
| 329 | double const diameterMercator = 2.0 * radiusMercator; |
| 330 | double const gapMercator = diameterMercator; |
| 331 | dp::Color const circleColor = df::GetColorConstant(kRoutePreview); |
| 332 | |
| 333 | for (auto const & previewSegment : m_previewSegments) |
| 334 | { |
| 335 | auto const & info = previewSegment.second; |
| 336 | m2::PolylineD polyline = {info.m_startPoint, info.m_finishPoint}; |
| 337 | double const segmentLen = polyline.GetLength(); |
| 338 | auto circlesCount = static_cast<size_t>(segmentLen / (diameterMercator + gapMercator)); |
| 339 | if (circlesCount == 0) |
| 340 | circlesCount = 1; |
| 341 | double const distDelta = segmentLen / circlesCount; |
| 342 | for (double d = distDelta * 0.5; d < segmentLen; d += distDelta) |
| 343 | { |
| 344 | m2::PointD const pt = polyline.GetPointByDistance(d); |
| 345 | m2::RectD const circleRect(pt.x - radiusMercator, pt.y - radiusMercator, pt.x + radiusMercator, |
| 346 | pt.y + radiusMercator); |
| 347 | if (!screen.ClipRect().IsIntersect(circleRect)) |
| 348 | continue; |
| 349 | |
| 350 | size_t pointIndex; |
| 351 | CirclesPackHandle * h = GetPreviewHandle(pointIndex); |
| 352 | if (h == nullptr) |
| 353 | { |
| 354 | // There is no any available handle. |
| 355 | m_previewPointsRequest(kPreviewPointsCount); |
| 356 | m_waitForPreviewRenderData = true; |
| 357 | return; |
| 358 | } |
| 359 | |
| 360 | m2::PointD const convertedPt = MapShape::ConvertToLocal(pt, m_previewPivot, kShapeCoordScalar); |
| 361 | h->SetPoint(pointIndex, convertedPt, previewCircleRadius, circleColor); |
| 362 | } |
| 363 | } |
| 364 | } |
| 365 | |
| 366 | void RouteRenderer::ClearPreviewHandles() |
no test coverage detected