MCPcopy Create free account
hub / github.com/comaps/comaps / PrepareArrowGeometry

Method PrepareArrowGeometry

libs/drape_frontend/route_shape.cpp:271–378  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

269}
270
271void 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.

Callers

nothing calls this directly

Calls 15

ASSERTFunction · 0.85
ConstructLineSegmentsFunction · 0.85
UpdateNormalsFunction · 0.85
FromVec2Function · 0.85
ToVec2Function · 0.85
GetNormalFunction · 0.85
GetUVFunction · 0.85
vec2Class · 0.85
GenerateJoinNormalsFunction · 0.85
GenerateArrowsTrianglesFunction · 0.85
setMinXMethod · 0.80
minXMethod · 0.80

Tested by

no test coverage detected