#pragma once #include #include #include #include #include #include #include namespace mbgl { class LineVertexBuffer; class TriangleElementsBuffer; class LineShader; class LineSDFShader; class LinepatternShader; class LineBucket : public Bucket { using TriangleGroup = ElementGroup<3>; public: LineBucket(uint32_t overscaling); ~LineBucket() override; void upload(gl::ObjectStore&) override; void render(Painter&, const style::Layer&, const UnwrappedTileID&, const mat4&) override; bool hasData() const override; bool needsClipping() const override; void addGeometry(const GeometryCollection&); void addGeometry(const GeometryCoordinates& line); void drawLines(LineShader&, gl::ObjectStore&); void drawLineSDF(LineSDFShader&, gl::ObjectStore&); void drawLinePatterns(LinepatternShader&, gl::ObjectStore&); private: struct TriangleElement { TriangleElement(uint16_t a_, uint16_t b_, uint16_t c_) : a(a_), b(b_), c(c_) {} uint16_t a, b, c; }; void addCurrentVertex(const GeometryCoordinate& currentVertex, double& distance, const Point& normal, double endLeft, double endRight, bool round, GLint startVertex, std::vector& triangleStore); void addPieSliceVertex(const GeometryCoordinate& currentVertex, double distance, const Point& extrude, bool lineTurnsLeft, GLint startVertex, std::vector& triangleStore); public: style::LineLayoutProperties layout; private: LineVertexBuffer vertexBuffer; TriangleElementsBuffer triangleElementsBuffer; GLint e1; GLint e2; GLint e3; std::vector> triangleGroups; const uint32_t overscaling; }; } // namespace mbgl