Mesh Generate::line(const vector<VectorF> &linePointsIn, TextureDescriptor texture, Color color, float lineWidth) { if(linePointsIn.size() < 2) // if less than 2 points then we can't have a line { return Mesh(new Mesh_t()); } vector<VectorF> linePoints; linePoints.reserve(linePointsIn.size()); linePoints.push_back(linePointsIn[0]); for(size_t i = 1; i < linePointsIn.size(); i++) { if(absSquared(linePointsIn[i] - linePoints.back()) >= eps * eps) // remove duplicates linePoints.push_back(linePointsIn[i]); } if(linePoints.size() < 2) // if less than 2 points then we can't have a line { return Mesh(new Mesh_t()); } vector<Edge> edges; edges.reserve(linePoints.size()); float distance = 0; edges.push_back(makeStartEdge(linePoints[0], linePoints[1], distance, lineWidth)); distance += abs(linePoints[1] - linePoints[0]); for(size_t i = 2; i < linePoints.size(); i++) { edges.push_back(makeMiddleEdge(linePoints[i - 2], linePoints[i - 1], linePoints[i], distance, lineWidth)); distance += abs(linePoints[i - 1] - linePoints[i]); } edges.push_back(makeEndEdge(linePoints[linePoints.size() - 2], linePoints[linePoints.size() - 1], distance, lineWidth)); Mesh retval = nullptr; for(size_t i = 1; i < edges.size(); i++) { TextureDescriptor currentTexture = texture.subTexture(edges[i - 1].distance / distance, edges[i].distance / distance, 0, 1); Mesh mesh = Generate::quadrilateral(currentTexture, edges[i - 1].p2, color, edges[i].p2, color, edges[i].p1, color, edges[i - 1].p1, color); if(retval == nullptr) retval = mesh; else retval->add(mesh); } return retval; }