diff --git a/graphics/path_renderer.cpp b/graphics/path_renderer.cpp index 1e5b845c78..356ad9fcb3 100644 --- a/graphics/path_renderer.cpp +++ b/graphics/path_renderer.cpp @@ -12,13 +12,15 @@ namespace graphics { PathRenderer::Params::Params() : m_drawPathes(true), - m_fastSolidPath(true) + m_fastSolidPath(true), + m_useNormals(false) {} - PathRenderer::PathRenderer(Params const & params) - : base_t(params), - m_drawPathes(params.m_drawPathes), - m_fastSolidPath(params.m_fastSolidPath) + PathRenderer::PathRenderer(Params const & p) + : base_t(p), + m_drawPathes(p.m_drawPathes), + m_fastSolidPath(p.m_fastSolidPath), + m_useNormals(p.m_useNormals) {} void PathRenderer::drawPath(m2::PointD const * pts, size_t ptsCount, double offset, uint32_t resID, double depth) @@ -211,12 +213,21 @@ namespace graphics m2::PointF rawTileEndPt(rawTileStartPt.x + dir.x * rawTileLen, rawTileStartPt.y + dir.y * rawTileLen); - m2::PointF coords[4] = + m2::PointF coords[4]; + + if (m_useNormals) { - rawTileStartPt + fNorm, - rawTileStartPt - fNorm, - rawTileEndPt - fNorm, - rawTileEndPt + fNorm + coords[0] = rawTileStartPt; + coords[1] = rawTileStartPt; + coords[2] = rawTileEndPt; + coords[3] = rawTileEndPt; + } + else + { + coords[0] = rawTileStartPt + fNorm; + coords[1] = rawTileStartPt - fNorm; + coords[2] = rawTileEndPt - fNorm; + coords[3] = rawTileEndPt + fNorm; }; m2::PointF texCoords[4] = @@ -227,13 +238,17 @@ namespace graphics texture->mapPixel(m2::PointF(texMaxX, texMinY)) }; - m2::PointF normals[4] = + m2::PointF normals[4]; + + if (m_useNormals) { - m2::PointF(0, 0), - m2::PointF(0, 0), - m2::PointF(0, 0), - m2::PointF(0, 0) - }; + normals[0] = fNorm; + normals[1] = -fNorm; + normals[2] = -fNorm; + normals[3] = fNorm; + } + else + memset(normals, 0, sizeof(normals)); addTexturedFan(coords, normals, @@ -303,20 +318,27 @@ namespace graphics /// Rotate start vector to find another point on a join. startVec.Rotate(angleStep); - /// Computing three points of a join segment. - m2::PointF joinSeg[3] = - { - m2::PointF(points[i + 1]), - m2::PointF(points[i + 1] + startVec * geomHalfWidth), - m2::PointF(points[i + 1] + prevStartVec * geomHalfWidth) - }; + m2::PointF joinSeg[3]; + m2::PointF joinSegNormals[3]; - m2::PointF joinSegNormals[3] = + if (m_useNormals) { - m2::PointF(0, 0), - m2::PointF(0, 0), - m2::PointF(0, 0) - }; + joinSeg[0] = points[i + 1]; + joinSeg[1] = points[i + 1]; + joinSeg[2] = points[i + 1]; + + joinSegNormals[0] = m2::PointF(0, 0); + joinSegNormals[1] = startVec * geomHalfWidth; + joinSegNormals[2] = prevStartVec * geomHalfWidth; + } + else + { + joinSeg[0] = m2::PointF(points[i + 1]); + joinSeg[1] = m2::PointF(points[i + 1] + startVec * geomHalfWidth); + joinSeg[2] = m2::PointF(points[i + 1] + prevStartVec * geomHalfWidth); + + memset(joinSegNormals, 0, sizeof(joinSegNormals)); + } addTexturedFan(joinSeg, joinSegNormals, @@ -488,5 +510,10 @@ namespace graphics } base_t::endFrame(); } + + void PathRenderer::setUseNormals(bool flag) + { + m_useNormals = flag; + } } diff --git a/graphics/path_renderer.hpp b/graphics/path_renderer.hpp index 5e303c8d1d..8089b40757 100644 --- a/graphics/path_renderer.hpp +++ b/graphics/path_renderer.hpp @@ -15,6 +15,7 @@ namespace graphics unsigned m_pointsCount; bool m_drawPathes; bool m_fastSolidPath; + bool m_useNormals; void drawSolidPath(m2::PointD const * pts, size_t ptsCount, double offset, Pen const * pen, double depth); void drawStipplePath(m2::PointD const * pts, size_t ptsCount, double offset, Pen const * pen, double depth); @@ -28,6 +29,7 @@ namespace graphics { bool m_drawPathes; bool m_fastSolidPath; + bool m_useNormals; Params(); }; @@ -37,5 +39,7 @@ namespace graphics void beginFrame(); void endFrame(); + + void setUseNormals(bool flag); }; }