diff --git a/drape_frontend/apply_feature_functors.cpp b/drape_frontend/apply_feature_functors.cpp index 488f193b6f..431535842a 100644 --- a/drape_frontend/apply_feature_functors.cpp +++ b/drape_frontend/apply_feature_functors.cpp @@ -287,7 +287,7 @@ ApplyLineFeature::ApplyLineFeature(EngineContext & context, TileKey tileKey, void ApplyLineFeature::operator ()(CoordPointT const & point) { - m2::PointF const inputPt(point.first, point.second); + m2::PointD const inputPt(point.first, point.second); if (m_spline.IsNull()) m_spline.Reset(new m2::Spline()); diff --git a/drape_frontend/line_shape.cpp b/drape_frontend/line_shape.cpp index a9ac0448a3..debfb4dbe8 100644 --- a/drape_frontend/line_shape.cpp +++ b/drape_frontend/line_shape.cpp @@ -65,71 +65,84 @@ void Bisector(float R, PointF const & v1, PointF const & v2, PointF const & v3, LineShape::LineShape(vector const & points, LineViewParams const & params, float const scaleGtoP) : m_params(params) + , m_dpoints(points) , m_scaleGtoP(scaleGtoP) + , m_counter(0) + , m_parts(1) { ASSERT_GREATER(points.size(), 1, ()); +} - if (m_params.m_pattern.empty()) +bool LineShape::GetNext(m2::PointF & point) const +{ + int const size = m_dpoints.size(); + if (!m_params.m_pattern.empty()) { - int const size = params.m_cap == dp::ButtCap ? points.size() : points.size() + 2; - m_points.resize(size); - if (m_params.m_cap != dp::ButtCap) + if (m_counter == 0) { - m_points[0] = points[0] + (points[0] - points[1]).Normalize();; - m_points[size - 1] = points[size - 3] + (points[size - 3] - points[size - 4]).Normalize(); - for (int i = 0; i < size - 2; ++i) - m_points[i+1] = points[i]; + point = m_dpoints[m_counter++]; + return true; } - else + if (m_counter < size) { - for (int i = 0; i < size; ++i) - m_points[i] = points[i]; + PointF const pt = m_dpoints[m_counter] - m_dpoints[m_counter - 1]; + float const length = pt.Length() * m_scaleGtoP; + if (length > m_templateLength - m_patternLength) + { + int const numParts = static_cast(ceilf(length / (m_templateLength - m_patternLength))); + PointF const addition = pt / (float)numParts; + point = m_dpoints[m_counter - 1] + addition * m_parts; + m_parts++; + if (m_parts > numParts) + { + m_parts = 1; + m_counter++; + } + return true; + } + if (m_templateLength == m_patternLength && length > m_templateLength) + { + int const numParts = static_cast(ceilf(length / m_templateLength)); + PointF const addition = pt / (float)numParts; + point = m_dpoints[m_counter-1] + addition * m_parts; + m_parts++; + if (m_parts == numParts) + { + m_parts = 0; + m_counter++; + } + return true; + } + point = m_dpoints[m_counter++]; + return true; } + if (m_counter == size && m_params.m_cap != dp::ButtCap) + { + point = m_dpoints[size - 1] + (m_dpoints[size - 1] - m_dpoints[size - 2]).Normalize(); + m_counter++; + return true; + } + return false; } else { - int const size = points.size(); - m_points.resize(size); - for (int i = 0; i < size; ++i) - m_points[i] = points[i]; - } -} - -void LineShape::doPartition(uint32_t patternLength, uint32_t templateLength, vector & points) const -{ - int const size = m_points.size(); - if (m_params.m_cap != dp::ButtCap) - points.push_back(m_points[0] + (m_points[0] - m_points[1]).Normalize()); - - points.push_back(m_points[0]); - for (int i = 1; i < size; ++i) - { - PointF const pt = m_points[i] - m_points[i - 1]; - float const length = pt.Length() * m_scaleGtoP; - if (length > templateLength - patternLength) + if (m_counter < size) { - int const numParts = static_cast(ceilf(length / (templateLength - patternLength))); - PointF const addition = pt / (float)numParts; - for (int j = 1; j < numParts; ++j) - points.push_back(points.back() + addition); + point = m_dpoints[m_counter++]; + return true; } - if (templateLength == patternLength && length > templateLength) + if (m_counter == size && m_params.m_cap != dp::ButtCap) { - int const numParts = static_cast(ceilf(length / templateLength)); - PointF const addition = pt / (float)numParts; - for (int j = 1; j < numParts; ++j) - points.push_back(points.back() + addition); + point = m_dpoints[size - 1] + (m_dpoints[size - 1] - m_dpoints[size - 2]).Normalize(); + m_counter++; + return true; } - points.push_back(m_points[i]); + return false; } - - if (m_params.m_cap != dp::ButtCap) - points.push_back(m_points[size - 1] + (m_points[size - 1] - m_points[size - 2]).Normalize()); } void LineShape::Draw(dp::RefPointer batcher, dp::RefPointer textures) const { - float templateLength, patternLength; int textureOpacitySet; m2::RectF rectOpacity; float texIndexPattern; @@ -140,22 +153,19 @@ void LineShape::Draw(dp::RefPointer batcher, dp::RefPointerGetStippleRegion(key, region); - patternLength = region.GetPatternLength(); - templateLength = region.GetTemplateLength(); + m_patternLength = region.GetPatternLength(); + m_templateLength = region.GetTemplateLength(); rectOpacity = m2::RectF(region.GetTexRect()); texIndexPattern = static_cast(region.GetTextureNode().m_textureOffset); textureOpacitySet = region.GetTextureNode().m_textureSet; - - doPartition(patternLength, templateLength, points); } - vector const & activePoints = m_params.m_pattern.empty() ? m_points : points; - - int size = activePoints.size(); + int const SIZE = 128; + int size = SIZE; float const r = 1.0f; - int const numVert = (size - 1) * 4; + int numVert = (size - 1) * 4; vector vertex(numVert); vector dxVals(numVert); vector centers(numVert); @@ -163,8 +173,14 @@ void LineShape::Draw(dp::RefPointer batcher, dp::RefPointer batcher, dp::RefPointer batcher, dp::RefPointer & points) const; + bool GetNext(m2::PointF & point) const; private: LineViewParams m_params; - vector m_points; + vector m_dpoints; float const m_scaleGtoP; + mutable int m_counter; + mutable int m_parts; + mutable uint32_t m_patternLength; + mutable uint32_t m_templateLength; }; } // namespace df