From 88cebdf0907a161f88ca91413da1f5ab25926e1d Mon Sep 17 00:00:00 2001 From: Dmitry Kunin Date: Tue, 4 Feb 2014 12:48:52 +0300 Subject: [PATCH] [drape] compose points to create caps. --- drape_frontend/line_shape.cpp | 88 +++++++++++++++++++++++----- drape_frontend/map_shape.hpp | 19 +----- drape_frontend/shape_view_params.hpp | 12 ++-- 3 files changed, 80 insertions(+), 39 deletions(-) diff --git a/drape_frontend/line_shape.cpp b/drape_frontend/line_shape.cpp index 670706c7dd..877a52f77a 100644 --- a/drape_frontend/line_shape.cpp +++ b/drape_frontend/line_shape.cpp @@ -50,12 +50,37 @@ namespace df void LineShape::Draw(RefPointer batcher) const { + //join, cap, segment params + // vertex type: + // [x] - {-1 : cap, 0 : segment, +1 : join} + // [y] - cap: { 0 : round, 1 : butt, -1 : square} + // [z] - join : {0: none, round : 1, bevel : 2} + // [w] - unused + const float T_CAP = -1.f; + const float T_SEGMENT = 0.f; + const float T_JOIN = +1.f; + vector renderPoints; - vector renderNormals; + vector renderDirections; + vector renderVertexTypes; const float hw = GetWidth() / 2.0f; typedef m2::PointF vec2; + // Add start cap quad + vec2 firstSegment = m_points[1] - m_points[0]; + vec2 direction = firstSegment; + + m2::PointF firstPoint = m_points[0]; + // Cap quad points + renderPoints.push_back(Point3D::From2D(firstPoint, m_depth)); // A + renderDirections.push_back(Point3D::From2D(direction, hw)); + renderVertexTypes.push_back(Point3D(T_CAP, m_params.m_cap, 0)); + + renderPoints.push_back(Point3D::From2D(firstPoint, m_depth)); // B + renderDirections.push_back(Point3D::From2D(direction, -hw)); + renderVertexTypes.push_back(Point3D(T_CAP, m_params.m_cap, 0)); + vec2 start = m_points[0]; for (size_t i = 1; i < m_points.size(); ++i) { @@ -67,7 +92,7 @@ namespace df vec2 longer = m_points[i+1] - start; const float dp = m2::DotProduct(segment, longer); const bool isCodirected = my::AlmostEqual(dp, static_cast( - m2::PointF::LengthFromZero(segment) + m2::PointF::LengthFromZero(segment) * m2::PointF::LengthFromZero(longer))); // We must not skip and unite with zero-length vectors. @@ -80,33 +105,52 @@ namespace df continue; } - ToPoint3DFunctor convertTo3d(m_depth); - const Point3D start3d = convertTo3d(start); - const Point3D end3d = convertTo3d(end); - convertTo3d.SetThirdComponent(hw); - const Point3D normalPos = convertTo3d(segment); - const Point3D normalNeg = convertTo3d(-segment); + const Point3D start3d = Point3D::From2D(start, m_depth); + const Point3D end3d = Point3D::From2D(end, m_depth); + + const Point3D directionPos = Point3D::From2D(segment, hw); + const Point3D directionNeg = Point3D::From2D(segment, -hw); renderPoints.push_back(start3d); + renderDirections.push_back(directionPos); + renderVertexTypes.push_back(Point3D(T_SEGMENT, 0, 0)); + renderPoints.push_back(start3d); - renderNormals.push_back(normalPos); - renderNormals.push_back(normalNeg); + renderDirections.push_back(directionNeg); + renderVertexTypes.push_back(Point3D(T_SEGMENT, 0, 0)); renderPoints.push_back(end3d); + renderDirections.push_back(directionPos); + renderVertexTypes.push_back(Point3D(T_SEGMENT, 0, 0)); + renderPoints.push_back(end3d); - renderNormals.push_back(normalPos); - renderNormals.push_back(normalNeg); + renderDirections.push_back(directionNeg); + renderVertexTypes.push_back(Point3D(T_SEGMENT, 0, 0)); start = end; } + //Add final cap + const size_t count = m_points.size(); + vec2 lastSegment = m_points[count-1] - m_points[count-2]; + m2::PointF lastPoint = m_points[count-1]; + direction = -lastSegment; + + renderPoints.push_back(Point3D::From2D(lastPoint, m_depth)); // A + renderDirections.push_back(Point3D::From2D(direction, -hw)); + renderVertexTypes.push_back(Point3D(T_CAP, m_params.m_cap, 0)); + + renderPoints.push_back(Point3D::From2D(lastPoint, m_depth)); // B + renderDirections.push_back(Point3D::From2D(direction, hw)); + renderVertexTypes.push_back(Point3D(T_CAP, m_params.m_cap, 0)); + // GLState state(gpu::SOLID_LINE_PROGRAM, 0, TextureBinding("", false, 0, MakeStackRefPointer(NULL))); float r, g, b, a; ::Convert(GetColor(), r, g, b, a); state.GetUniformValues().SetFloatValue("color", r, g, b, a); - AttributeProvider provider(2, renderPoints.size()); + AttributeProvider provider(3, renderPoints.size()); { BindingInfo positionInfo(1); @@ -121,15 +165,27 @@ namespace df } { - BindingInfo normalInfo(1); - BindingDecl & decl = normalInfo.GetBindingDecl(0); + BindingInfo directionInfo(1); + BindingDecl & decl = directionInfo.GetBindingDecl(0); decl.m_attributeName = "direction"; decl.m_componentCount = 3; decl.m_componentType = GLConst::GLFloatType; decl.m_offset = 0; decl.m_stride = 0; - provider.InitStream(1, normalInfo, MakeStackRefPointer((void*)&renderNormals[0])); + provider.InitStream(1, directionInfo, MakeStackRefPointer((void*)&renderDirections[0])); + } + + { + BindingInfo vertexTypeInfo(1); + BindingDecl & decl = vertexTypeInfo.GetBindingDecl(0); + decl.m_attributeName = "a_vertType"; + decl.m_componentCount = 3; + decl.m_componentType = GLConst::GLFloatType; + decl.m_offset = 0; + decl.m_stride = 0; + + provider.InitStream(2, vertexTypeInfo, MakeStackRefPointer((void*)&renderVertexTypes[0])); } batcher->InsertTriangleStrip(state, MakeStackRefPointer(&provider)); diff --git a/drape_frontend/map_shape.hpp b/drape_frontend/map_shape.hpp index 021e178ff3..bb5234f8e1 100644 --- a/drape_frontend/map_shape.hpp +++ b/drape_frontend/map_shape.hpp @@ -21,26 +21,11 @@ namespace df , m_y(y) , m_z(z) {} - }; - struct ToPoint3DFunctor - { - ToPoint3DFunctor(float thirdComponent) - : m_thirdComponent(thirdComponent) - {} - - Point3D operator ()(m2::PointF const & p) + static Point3D From2D(m2::PointF const & src, float thirdComponent = 0) { - return Point3D(p.x, p.y, m_thirdComponent); + return Point3D(src.x, src.y, thirdComponent); } - - void SetThirdComponent(float c) - { - m_thirdComponent = c; - } - - private: - float m_thirdComponent; }; /// diff --git a/drape_frontend/shape_view_params.hpp b/drape_frontend/shape_view_params.hpp index 907706aa7d..076f5da0c9 100644 --- a/drape_frontend/shape_view_params.hpp +++ b/drape_frontend/shape_view_params.hpp @@ -6,16 +6,16 @@ namespace df { enum LineCap { - RoundCap, - ButtCap, - SquareCap + SquareCap = -1, + RoundCap = 0, + ButtCap = 1, }; enum LineJoin { - NonJoin, - RoundJoin, - BevelJoin + NonJoin = 0, + RoundJoin = 1, + BevelJoin = 2 }; struct LineViewParams