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

Method PrepareGeometry

libs/drape_frontend/route_shape.cpp:151–269  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

149}
150
151void RouteShape::PrepareGeometry(std::vector<m2::PointD> const & path, m2::PointD const & pivot,
152 std::vector<glsl::vec4> const & segmentsColors, float baseDepth,
153 std::vector<GeometryBufferData<GeometryBuffer>> & geometryBufferData)
154{
155 ASSERT(path.size() > 1, ());
156
157 // Construct segments.
158 std::vector<LineSegment> segments;
159 segments.reserve(path.size() - 1);
160 ConstructLineSegments(path, segmentsColors, segments);
161
162 if (segments.empty())
163 return;
164
165 // Build geometry.
166 float length = 0.0f;
167 for (auto const & segment : segments)
168 length += glsl::length(segment.m_points[EndPoint] - segment.m_points[StartPoint]);
169
170 geometryBufferData.push_back({});
171
172 uint32_t constexpr kMinVertices = 5000;
173 double constexpr kMinExtent = mercator::Bounds::kRangeX / (1 << 10);
174
175 float depth = baseDepth;
176 float const depthStep = rs::kRouteDepth / (1 + segments.size());
177 int const lastIndex = static_cast<int>(segments.size() - 1);
178 for (int i = lastIndex; i >= 0; i--)
179 {
180 auto & geomBufferData = geometryBufferData.back();
181 auto & geometry = geomBufferData.m_geometry;
182 auto & joinsGeometry = geomBufferData.m_joinsGeometry;
183
184 UpdateNormals(&segments[i], (i > 0) ? &segments[i - 1] : nullptr, i < lastIndex ? &segments[i + 1] : nullptr);
185
186 geomBufferData.m_boundingBox.Add(glsl::FromVec2(segments[i].m_points[StartPoint]));
187 geomBufferData.m_boundingBox.Add(glsl::FromVec2(segments[i].m_points[EndPoint]));
188
189 // Generate main geometry.
190 m2::PointD const startPt =
191 MapShape::ConvertToLocal(glsl::FromVec2(segments[i].m_points[StartPoint]), pivot, kShapeCoordScalar);
192 m2::PointD const endPt =
193 MapShape::ConvertToLocal(glsl::FromVec2(segments[i].m_points[EndPoint]), pivot, kShapeCoordScalar);
194
195 glsl::vec3 const startPivot = glsl::vec3(glsl::ToVec2(startPt), depth);
196 glsl::vec3 const endPivot = glsl::vec3(glsl::ToVec2(endPt), depth);
197 depth += depthStep;
198
199 float const startLength = length - glsl::length(segments[i].m_points[EndPoint] - segments[i].m_points[StartPoint]);
200
201 glsl::vec2 const leftNormalStart = GetNormal(segments[i], true /* isLeft */, StartNormal);
202 glsl::vec2 const rightNormalStart = GetNormal(segments[i], false /* isLeft */, StartNormal);
203 glsl::vec2 const leftNormalEnd = GetNormal(segments[i], true /* isLeft */, EndNormal);
204 glsl::vec2 const rightNormalEnd = GetNormal(segments[i], false /* isLeft */, EndNormal);
205
206 float const projLeftStart = -segments[i].m_leftWidthScalar[StartPoint].y;
207 float const projLeftEnd = segments[i].m_leftWidthScalar[EndPoint].y;
208 float const projRightStart = -segments[i].m_rightWidthScalar[StartPoint].y;

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
vec2Class · 0.85
GenerateJoinNormalsFunction · 0.85
GenerateCapNormalsFunction · 0.85
backMethod · 0.80
SizeXMethod · 0.80
SizeYMethod · 0.80

Tested by

no test coverage detected