| 449 | } |
| 450 | |
| 451 | void RouteShape::CacheRouteArrows(ref_ptr<dp::GraphicsContext> context, ref_ptr<dp::TextureManager> mng, |
| 452 | m2::PolylineD const & polyline, std::vector<ArrowBorders> const & borders, |
| 453 | double baseDepthIndex, SubrouteArrowsData & routeArrowsData) |
| 454 | { |
| 455 | GeometryBufferData<ArrowGeometryBuffer> geometryData; |
| 456 | dp::TextureManager::SymbolRegion region; |
| 457 | rs::GetArrowTextureRegion(mng, region); |
| 458 | auto state = CreateRenderState(gpu::Program::RouteArrow, DepthLayer::GeometryLayer); |
| 459 | state.SetColorTexture(region.GetTexture()); |
| 460 | state.SetTextureIndex(region.GetTextureIndex()); |
| 461 | |
| 462 | // Generate arrow geometry. |
| 463 | auto depth = static_cast<float>(baseDepthIndex * rs::kDepthPerSubroute) + rs::kArrowsDepth; |
| 464 | float const depthStep = (rs::kArrowsDepth - rs::kRouteDepth) / (1 + borders.size()); |
| 465 | |
| 466 | std::vector<m2::PointD> points; |
| 467 | points.reserve(polyline.GetSize() / 4); |
| 468 | for (ArrowBorders const & b : borders) |
| 469 | { |
| 470 | depth -= depthStep; |
| 471 | rs::CalculatePoints(polyline, b.m_startDistance, b.m_endDistance, points); |
| 472 | PrepareArrowGeometry(points, routeArrowsData.m_pivot, region.GetTexRect(), depthStep, depth, geometryData); |
| 473 | } |
| 474 | |
| 475 | geometryData.m_boundingBox.Scale(kBoundingBoxScale); |
| 476 | |
| 477 | BatchGeometry(context, state, make_ref(geometryData.m_geometry.data()), |
| 478 | static_cast<uint32_t>(geometryData.m_geometry.size()), make_ref(geometryData.m_joinsGeometry.data()), |
| 479 | static_cast<uint32_t>(geometryData.m_joinsGeometry.size()), geometryData.m_boundingBox, |
| 480 | AV::GetBindingInfo(), routeArrowsData.m_renderProperty); |
| 481 | } |
| 482 | |
| 483 | drape_ptr<df::SubrouteData> RouteShape::CacheRoute(ref_ptr<dp::GraphicsContext> context, dp::DrapeID subrouteId, |
| 484 | SubrouteConstPtr subroute, size_t styleIndex, int recacheId) |
no test coverage detected