1 #pragma once
2
3 #include <mbgl/renderer/bucket.hpp>
4 #include <mbgl/tile/geometry_tile_data.hpp>
5 #include <mbgl/gl/vertex_buffer.hpp>
6 #include <mbgl/gl/index_buffer.hpp>
7 #include <mbgl/programs/segment.hpp>
8 #include <mbgl/programs/line_program.hpp>
9 #include <mbgl/style/layers/line_layer_properties.hpp>
10
11 #include <vector>
12
13 namespace mbgl {
14
15 class BucketParameters;
16 class RenderLineLayer;
17
18 class LineBucket : public Bucket {
19 public:
20 LineBucket(const BucketParameters&,
21 const std::vector<const RenderLayer*>&,
22 const style::LineLayoutProperties::Unevaluated&);
23
24 void addFeature(const GeometryTileFeature&,
25 const GeometryCollection&) override;
26 bool hasData() const override;
27
28 void upload(gl::Context&) override;
29
30 float getQueryRadius(const RenderLayer&) const override;
31
32 style::LineLayoutProperties::PossiblyEvaluated layout;
33
34 gl::VertexVector<LineLayoutVertex> vertices;
35 gl::IndexVector<gl::Triangles> triangles;
36 SegmentVector<LineAttributes> segments;
37
38 optional<gl::VertexBuffer<LineLayoutVertex>> vertexBuffer;
39 optional<gl::IndexBuffer<gl::Triangles>> indexBuffer;
40
41 std::map<std::string, LineProgram::PaintPropertyBinders> paintPropertyBinders;
42
43 private:
44 void addGeometry(const GeometryCoordinates&, const GeometryTileFeature&);
45
46 struct TriangleElement {
TriangleElementmbgl::LineBucket::TriangleElement47 TriangleElement(uint16_t a_, uint16_t b_, uint16_t c_) : a(a_), b(b_), c(c_) {}
48 uint16_t a, b, c;
49 };
50 void addCurrentVertex(const GeometryCoordinate& currentVertex, double& distance,
51 const Point<double>& normal, double endLeft, double endRight, bool round,
52 std::size_t startVertex, std::vector<LineBucket::TriangleElement>& triangleStore);
53 void addPieSliceVertex(const GeometryCoordinate& currentVertex, double distance,
54 const Point<double>& extrude, bool lineTurnsLeft, std::size_t startVertex,
55 std::vector<TriangleElement>& triangleStore);
56
57 std::ptrdiff_t e1;
58 std::ptrdiff_t e2;
59 std::ptrdiff_t e3;
60
61 const uint32_t overscaling;
62 const float zoom;
63
64 float getLineWidth(const RenderLineLayer& layer) const;
65 };
66
67 template <>
is() const68 inline bool Bucket::is<LineBucket>() const {
69 return layerType == style::LayerType::Line;
70 }
71
72 } // namespace mbgl
73