| 269 | } |
| 270 | |
| 271 | void RouteShape::PrepareArrowGeometry(std::vector<m2::PointD> const & path, m2::PointD const & pivot, |
| 272 | m2::RectF const & texRect, float depthStep, float depth, |
| 273 | GeometryBufferData<ArrowGeometryBuffer> & geometryBufferData) |
| 274 | { |
| 275 | ASSERT(path.size() > 1, ()); |
| 276 | |
| 277 | // Construct segments. |
| 278 | std::vector<LineSegment> segments; |
| 279 | segments.reserve(path.size() - 1); |
| 280 | ConstructLineSegments(path, std::vector<glsl::vec4>(), segments); |
| 281 | |
| 282 | auto & geometry = geometryBufferData.m_geometry; |
| 283 | auto & joinsGeometry = geometryBufferData.m_joinsGeometry; |
| 284 | |
| 285 | m2::RectF tr = texRect; |
| 286 | tr.setMinX(static_cast<float>(texRect.minX() * (1.0 - kArrowTailSize) + texRect.maxX() * kArrowTailSize)); |
| 287 | tr.setMaxX(static_cast<float>(texRect.minX() * kArrowHeadSize + texRect.maxX() * (1.0 - kArrowHeadSize))); |
| 288 | |
| 289 | // Build geometry. |
| 290 | float const depthInc = depthStep / (segments.size() + 1); |
| 291 | for (size_t i = 0; i < segments.size(); i++) |
| 292 | { |
| 293 | UpdateNormals(&segments[i], (i > 0) ? &segments[i - 1] : nullptr, |
| 294 | (i < segments.size() - 1) ? &segments[i + 1] : nullptr); |
| 295 | |
| 296 | geometryBufferData.m_boundingBox.Add(glsl::FromVec2(segments[i].m_points[StartPoint])); |
| 297 | geometryBufferData.m_boundingBox.Add(glsl::FromVec2(segments[i].m_points[EndPoint])); |
| 298 | |
| 299 | // Generate main geometry. |
| 300 | m2::PointD const startPt = |
| 301 | MapShape::ConvertToLocal(glsl::FromVec2(segments[i].m_points[StartPoint]), pivot, kShapeCoordScalar); |
| 302 | m2::PointD const endPt = |
| 303 | MapShape::ConvertToLocal(glsl::FromVec2(segments[i].m_points[EndPoint]), pivot, kShapeCoordScalar); |
| 304 | |
| 305 | glsl::vec4 const startPivot = glsl::vec4(glsl::ToVec2(startPt), depth, 1.0); |
| 306 | glsl::vec4 const endPivot = glsl::vec4(glsl::ToVec2(endPt), depth, 1.0); |
| 307 | depth += depthInc; |
| 308 | |
| 309 | glsl::vec2 const leftNormalStart = GetNormal(segments[i], true /* isLeft */, StartNormal); |
| 310 | glsl::vec2 const rightNormalStart = GetNormal(segments[i], false /* isLeft */, StartNormal); |
| 311 | glsl::vec2 const leftNormalEnd = GetNormal(segments[i], true /* isLeft */, EndNormal); |
| 312 | glsl::vec2 const rightNormalEnd = GetNormal(segments[i], false /* isLeft */, EndNormal); |
| 313 | |
| 314 | glsl::vec2 const uvCenter = rs::GetUV(tr, 0.5f, 0.5f); |
| 315 | glsl::vec2 const uvLeft = rs::GetUV(tr, 0.5f, 0.0f); |
| 316 | glsl::vec2 const uvRight = rs::GetUV(tr, 0.5f, 1.0f); |
| 317 | |
| 318 | geometry.emplace_back(startPivot, glsl::vec2(0, 0), uvCenter); |
| 319 | geometry.emplace_back(startPivot, leftNormalStart, uvLeft); |
| 320 | geometry.emplace_back(endPivot, glsl::vec2(0, 0), uvCenter); |
| 321 | geometry.emplace_back(endPivot, leftNormalEnd, uvLeft); |
| 322 | |
| 323 | geometry.emplace_back(startPivot, rightNormalStart, uvRight); |
| 324 | geometry.emplace_back(startPivot, glsl::vec2(0, 0), uvCenter); |
| 325 | geometry.emplace_back(endPivot, rightNormalEnd, uvRight); |
| 326 | geometry.emplace_back(endPivot, glsl::vec2(0, 0), uvCenter); |
| 327 | |
| 328 | // Generate joins. |
nothing calls this directly
no test coverage detected