| 149 | } |
| 150 | |
| 151 | void 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; |
nothing calls this directly
no test coverage detected